IEntityTypeConfiguration

第一步:创建一个类库,我把这个类库的名字叫做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);
           

        }
    }
}

 

你可能感兴趣的:(IEntityTypeConfiguration)