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都幫你弄好囉。
一天一分享,身體好健康。
該追究的不是過去的原因,而是現在的目的。