第一步:创建一个类库,我把这个类库的名字叫做BF.Entities ,这个类库主要是放了我们的EF的上下文DbContext类等,还有类的模型
第二步:创建模型类
public class Book
{
public int Id { get; set; }
//书名
public string BookName { get; set; }
//作者姓名(一本书有一个位作者)
public int AuthorId { get; set; }
//导航属性,一本书有一个作者
public Author Author { get; set; }
}
2
public class Author
{
public int Id { get; set; }
//作者姓名
public string AuthorName { get; set; }
}
第三步:在做BF.Entities类库中创建一个单独的存放FluentAPI配置类的文件夹,我取名叫 EntityConfig,然后再里面添加一个名字为 BookConfig的类,用于对Book这个实体模型类的配置
namespace BF.Entity.EntityConfig
{
//我们自定义的BookConfig类,让它继承 IEntityTypeConfiguration接口 并实现接口中的Configure方法
public class BookConfig : IEntityTypeConfiguration
{
public void Configure(EntityTypeBuilder builder)
{
builder.ToTable("Book").HasKey(r => r.Id);
builder.Property(r => r.AuthorId).IsRequired();
//一对多的关系配置 :
//builder.HasOne(r => r.Author)表示Book这个实体中有一个Author
//builder.HasOne(r => r.Author).WithMany()表示Book实体中有一个Author,而个Author中有多个Book
builder.HasOne(r => r.Author).WithMany().HasForeignKey(r => r.AuthorId);
}
}
}
在添加一个模型配置类AuthorConfig,用于对Author这个实体模型类配置
namespace BF.Entity.EntityConfig
{
public class AuthorConfig:IEntityTypeConfiguration
{
public void Configure(EntityTypeBuilder builder)
{
builder.ToTable("Author").HasKey(r => r.Id); //注:如果Author这个表是以Id做主键的,则可以不用写HasKey(r=>r.Id);
builder.Property(r => r.AuthorName).HasMaxLength(20);
}
}
}
第四步:既然创建了模型类的 FluentAPI配置类,那总的要使用吧。怎么使用呢? 我们可以去到我们上下文容器类中去配置使用,我们应该在OnModelCreating方法中将所有的配置模型类的 FluentAPI配置类加入到DbModelBuilder容器中
using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
namespace MvcApp.Controllers
{
public class MyDbContext : DbContext
{
public DbSet Book { get; set; }
public DbSet Author { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
//使用sql server数据库
//optionsBuilder.UseSqlServer("Data Source=192.168.0.207,1433;Initial Catalog=db_hk_wx;User ID=hkuser;Password=zkhk2017")
//使用mysql 数据库
optionsBuilder.UseMySql("Data Source=47.98.58.222;port=3306;Initial Catalog=FBTest;user id=root;password=zkhk2017;Character Set=utf8");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
//将实现了IEntityTypeConfiguration接口的模型配置类加入到modelBuilder中,进行注册
var typesToRegister = Assembly.GetExecutingAssembly().GetTypes().Where(q => q.GetInterface(typeof(IEntityTypeConfiguration<>).FullName) != null);
foreach (var type in typesToRegister)
{
dynamic configurationInstance = Activator.CreateInstance(type);
modelBuilder.ApplyConfiguration(configurationInstance);
}
//配置表模型信息:注:我们现在不在这里进行模型配置了。
//var book = modelBuilder.Entity();
//book.ToTable("Book").HasKey(r=>r.Id);
//book.Property(r => r.BookName).HasMaxLength(20);
//book.Property(r => r.AuthorId).IsRequired();
//一本书,有一个作者,外键是AuthorId,不许为空
//book.HasOne(r => r.Author).WithMany().HasForeignKey(r => r.AuthorId).IsRequired();
//var author = modelBuilder.Entity();
//author.ToTable("Author").HasKey(r => r.Id);
//author.Property(r => r.AuthorName).IsRequired().HasMaxLength(20);
}
}
}