着四个包的作用大概说明下:
1、Microsoft.EntityFrameworkCore
这是ef core的核心包
2、Microsoft.EntityFrameworkCore.SqlServer
sqlserver 数据库驱动包
3、Microsoft.EntityFrameworkCore.Tools
工具扩展包
4、Microsoft.EntityFrameworkCore.Proxies
延迟加载实现包
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 列设置了 默认值。
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
代码如下:
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 程序包管理控制台:
然后将默认项目设置为 MyCodeFirstTest.DAL
然后输入:Add-Migration Init
如图:
然后输入:
update-database Init
会看到结果:
这时候,数据库也会初始化好。
这里的 Init 只是一个名字,表示这里是初始化。
接下来看下更新,我们添加一个实体 ,增加一对多的关系
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