[Entity Framework][Code First]Organizing Fluent Configurations

Organizing Fluent Configurations

使用Fluent API設計Domain Class,通常都是寫在OnModelCreating底下,而當table很多的時候,OnModelCreating的程式碼會爆炸,應該會長到沒人想看。如下

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    var studentTable = modelBuilder.Entity<Student>()
        .ToTable("SpeciyStudent");

    studentTable.HasKey(x => x.StudentId);
    studentTable.Property(x => x.Name).IsRequired().HasMaxLength(10);
    studentTable.Property(x => x.Country).IsRequired();

    var courseTable = modelBuilder.Entity<Course>();

    courseTable.HasKey(x => x.CourseId);
    courseTable.Property(x => x.Name).IsRequired().HasMaxLength(10);
    courseTable.Property(x => x.Teacher).IsRequired().HasMaxLength(10);

    //...以下省略

}

為了避免這種情況發生,Code First有提供EntityTypeConfiguration class,可以讓你每個讓每一個table的configuration散落在每一個class上面,可以讓程式碼更乾淨。

所以我們可以將上續兩個table拆成兩個class

public class StudentConfiguration : EntityTypeConfiguration<Student>
{
    public StudentConfiguration()
    {
        ToTable("SpeciyStudent");
        HasKey(x => x.StudentId);
        Property(x => x.Name).IsRequired().HasMaxLength(10);
        Property(x => x.Country).IsRequired();
    }
}
public class CourseConfiguration : EntityTypeConfiguration<Course>
{
    public CourseConfiguration()
    {
        HasKey(x => x.CourseId);
        Property(x => x.Name).IsRequired().HasMaxLength(10);
        Property(x => x.Teacher).IsRequired().HasMaxLength(10);
    }
}

之後只要在OnModelCreating做add的動作就完成了

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Configurations.Add(new StudentConfiguration());
    modelBuilder.Configurations.Add(new CourseConfiguration());
}

這樣的程式碼是不是簡單很多呢。

 

等等....還沒結束,以為這是最簡單的寫法了嗎,錯!!!!!  以下要講的才是這篇的重點阿XDD

AddFromAssembly

Configurations還提供了另外一個AddFromAssembly的功能,可以自動加入Configuration。Registrar

說明:探索給定組件中繼承自 EntityTypeConfiguration 或 ComplexTypeConfiguration 的所有類型,並將所發現的每個類型的執行個體加入至此登錄器。

我看到這功能都笑了XD。  所以以後只要打一行,所有的Configuration都自動幫你Register好了。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{    
    modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());
}

之後新增的Domain classes只要寫好Configuration class,並把DbSet加入到DbContext就好了,不用再去Add Configuration,因為AddFromAssembly都幫你弄好囉。

 

 

一天一分享,身體好健康。

該追究的不是過去的原因,而是現在的目的。