EF Core Code First初始化及更新数据库

创建项目

1、创建web项目

EF Core Code First初始化及更新数据库_第1张图片
EF Core Code First初始化及更新数据库_第2张图片

2、创建DAL(.net core类库)

EF Core Code First初始化及更新数据库_第3张图片

3、在web项目上添加对类库的引用,并且在web项目和类库上都添加nuget引用

EF Core Code First初始化及更新数据库_第4张图片
在两个项目上都添加如下的nuget 引用:
EF Core Code First初始化及更新数据库_第5张图片

着四个包的作用大概说明下:
1、Microsoft.EntityFrameworkCore
这是ef core的核心包

2、Microsoft.EntityFrameworkCore.SqlServer
sqlserver 数据库驱动包

3、Microsoft.EntityFrameworkCore.Tools
工具扩展包

4、Microsoft.EntityFrameworkCore.Proxies
延迟加载实现包

4、编写相应代码

1、在DAL 类库中添加实体类

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text;

namespace MyCodeFirstTest.DAL
{
    [Table("UserInfo")]
    public class UserInfo
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int id { get; set; }
        [MaxLength(50),Required]
        public string name { get; set; }
        [MaxLength(50),Required]
        public string password { get; set; }
    }
}

实体类中用注解的方式进行了相关映射,
Table==>对应数据库表名
Key==>主键
DatabaseGenerated.Identity ==>数据库自动增长列

Required==>非空

2、编写 DbContext类

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Text;

namespace MyCodeFirstTest.DAL
{
    public class TestDbContext:DbContext
    {
     	public DbSet userInfos;
        public TestDbContext(DbContextOptions options)
         	:base(options)
        {
        }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {
            optionsBuilder.UseLazyLoadingProxies(false);
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder) {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity(entity=> {
                entity.Property(t => t.password).HasDefaultValue("123456");
            });
        }
    }
}

注意
1、 一定要添加 继承有参数的构造方法。否则会报错
2、此处禁止使用 延迟加载
3、采用了Fluent API的方式,给password 列设置了 默认值。

5、配置数据库连接,实现创建数据库

1、在web项目中添加 数据库连接
在web项目中找到appsettings.json,在其中添加连接字符串

"ConnectionStrings": {
    "dbConnections": "Data Source=172.20.100.232;Initial Catalog=TestDb;User ID=sa;Password=XXX"
  }

2、在startup.cs中添加引用,
using Microsoft.EntityFrameworkCore;

然后配置sqlserver 的连接,告知编译器 需要到程序集 MyCodeFirstTest.DAL中找到 dbContext
EF Core Code First初始化及更新数据库_第6张图片
代码如下:

   public void ConfigureServices(IServiceCollection services)
        {
            services.Configure(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });


            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
            services.AddDbContext(options => options.UseSqlServer(Configuration.GetConnectionString("dbConnections"),
                p => p.MigrationsAssembly("MyCodeFirstTest.DAL")));
        }

3、打开nuget 程序包管理控制台:

EF Core Code First初始化及更新数据库_第7张图片
然后将默认项目设置为 MyCodeFirstTest.DAL
然后输入:Add-Migration Init
如图:
EF Core Code First初始化及更新数据库_第8张图片
然后输入:
update-database Init
会看到结果:
EF Core Code First初始化及更新数据库_第9张图片
这时候,数据库也会初始化好。
EF Core Code First初始化及更新数据库_第10张图片

这里的 Init 只是一个名字,表示这里是初始化。
接下来看下更新,我们添加一个实体 ,增加一对多的关系

6、更新数据库

1、添加实体类

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text;

namespace MyCodeFirstTest.DAL
{
    [Table("UserInfoDetails")]
    public class UserInfoDetails
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int id { get; set; }

        public int userId { get; set; }
        [MaxLength(200),Required]
        public string email { get; set; }

        public virtual UserInfo userinfo { get; set; }


    }
}

这里只用注解方式 映射了主键、非空等,外键关系用 Fluent API添加吧
2、修改UserInfo 增加 1对多关系

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text;

namespace MyCodeFirstTest.DAL
{
    [Table("UserInfo")]
    public class UserInfo
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int id { get; set; }
        [MaxLength(50),Required]
        public string name { get; set; }
        [MaxLength(50),Required]
        public string password { get; set; }

        public virtual ICollection userInfoDetails { get; set; }
    }
}

只是增加了 public virtual ICollection userInfoDetails { get; set; } 这一句

3、修改 DbContext。增加 集合和映射关系

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Text;

namespace MyCodeFirstTest.DAL
{
    public class TestDbContext:DbContext
    {
        public DbSet userInfos;
        public DbSet infoDetailses { get; set; }
        public TestDbContext(DbContextOptions options)
            :base(options)
        {
        }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {
            optionsBuilder.UseLazyLoadingProxies(false);
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder) {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity(entity=> {
                entity.Property(t => t.password).HasDefaultValue("123456");
            });

            modelBuilder.Entity(entity=> {
                entity.HasOne(t => t.userinfo)
                .WithMany(t => t.userInfoDetails)
                .HasForeignKey(t => t.userId);
            });
        }
    }
}

完成后,再次 使用 add-migration 和 update-database,不过这次换个名字吧
add-migration addUserDetails
update-database addUserDetails

EF Core Code First初始化及更新数据库_第11张图片
可以看到数据库发生了改变。

你可能感兴趣的:(.net,core,ef,core,entityframework)