EF CodeFirst系列(7)--- FluentApi配置單個實體

  咱們已經知道了在OnModelCreating()方法中能夠經過FluentApi對全部的實體類進行配置,然而當實體類不少時,咱們把全部的配置都放在OnModelCreating()方法中很難維護。EF6容許咱們給每個實體添加一個單獨的配置類,經過這個配置類來對相應的實體進行配置ide

  以配置Student實體類爲例,咱們在OnModelCreating()方法中配置Student實體,代碼以下:ui

public class SchoolDBContext: DbContext 
{
    public SchoolDBContext(): base() 
    {
    }

    public DbSet<Student> Students { get; set; }
        
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
            modelBuilder.Entity<Student>().ToTable("StudentInfo");
                
            modelBuilder.Entity<Student>().HasKey<int>(s => s.StudentKey);
                
            modelBuilder.Entity<Student>()
                    .Property(p => p.DateOfBirth)
                    .HasColumnName("Birthday")
                    .HasColumnOrder(3)
                    .HasColumnType("datetime2");

            modelBuilder.Entity<Student>()
                    .Property(p => p.StudentName)
                    .HasMaxLength(50);
                        
                modelBuilder.Entity<Student>()
                    .Property(p => p.StudentName)
                    .IsConcurrencyToken();
                
            modelBuilder.Entity<Student>()
                .HasMany<Course>(s => s.Courses)
                .WithMany(c => c.Students)
                .Map(cs =>
                        {
                            cs.MapLeftKey("StudentId");
                            cs.MapRightKey("CourseId");
                            cs.ToTable("StudentCourse");
                        });
    }
}

  咱們能夠將每一個實體類的配置放在一個對應的的配置類,(如Studnet的實體配置在StudentEntityConfiguratinos配置類中),若是程序中有不少實體類,採用單獨配置的方式能夠很好的提升配置的可維護性和可讀性。this

步驟以下:spa

步驟①:建立一個StudentEntityConfiguratinos類,這個類繼承 EntityTypeConfiguration<TEntity> ,代碼以下:code

public class StudentEntityConfiguration: EntityTypeConfiguration<Student>
{
    public StudentEntityConfiguration()
    {
            this.ToTable("StudentInfo");
                
            this.HasKey<int>(s => s.StudentKey);
                
            this.Property(p => p.DateOfBirth)
                    .HasColumnName("DoB")
                    .HasColumnOrder(3)
                    .HasColumnType("datetime2");

            this.Property(p => p.StudentName)
                    .HasMaxLength(50);
                        
            this.Property(p => p.StudentName)
                    .IsConcurrencyToken();
                
            this.HasMany<Course>(s => s.Courses)
                .WithMany(c => c.Students)
                .Map(cs =>
                        {
                            cs.MapLeftKey("StudentId");
                            cs.MapRightKey("CourseId");
                            cs.ToTable("StudentCourse");
                        });
    }
}

步驟②: 在OnModelCreating()方法中使用上邊的配置類blog

public class SchoolDBContext: DbContext 
{
    public SchoolDBContext(): base() 
    {
    }

    public DbSet<Student> Students { get; set; }
        
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // 添加Student實體的配置
        modelBuilder.Configurations.Add(new StudentEntityConfiguration());
    }
}
相關文章
相關標籤/搜索