EF Fluent API

什麼是Fluent API?

官方答案:EF 中內嵌的約定將 POCO 類映射到表。但是,有時您無法或不想遵守這些約定,需要將實體映射到約定指示外的其他對象,所以Fluent API和註解都是一種方法,這兩種方法是用來配置EF,在映射屬性時繞開約定。詳情參考(https://msdn.microsoft.com/zh-cn/data/jj591617)

如何訪問Fluent API?

通過自定義類(繼承自DbContext )的OnModelCreating方法訪問。

屬性映射

主要配置:主鍵、數值長度、配置爲必須、不映射,外鍵等

 

配置主鍵:

modelBuilder.Entity<ClassA>().HasKey(t => t.ID);    //配置ClassA的ID屬性爲主鍵

 

配置聯合主鍵:

modelBuilder.Entity<ClassA>().HasKey(t => new { t.ID, t.Name });    //配置ClassA的ID和Name爲主鍵

設置數據非數據庫生成:

modelBuilder.Entity<ClassA>().Property(t => t.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);    //ClassA的Id屬性不用數據庫控制生成

設置字段最大長度:

modelBuilder.Entity<ClassA>().Property(t => t.Name).HasMaxLength(100);     //設置ClassA類的Name屬性的最大長度爲100,如果值長度100,會拋出 DbEntityValidationException異常

設置字段爲必需:

modelBuilder.Entity<ClassA>().Property(t =>t.Id).IsRequired();   //設置ClassA類的Id屬性爲必需   

屬性不映射到數據庫:

modelBuilder.Entity<ClassA>().Ignore(t => t.A);    //調過ClassA類的A屬性,讓之不映射到數據庫中

將屬性映射到數據庫中特定列名:

modelBuilder.Entity<ClassA>() 
    .Property(t => t.A) 
    .HasColumnName("A_a");   //將類ClassA的屬性A映射到數據庫中對應列名A_a

類中不指定外鍵,但在數據庫中指定外鍵名:

modelBuilder.Entity<Staff>() 
    .HasRequired(c => c.Department) 
    .WithMany(t => t.Staffs) 
    .Map(m => m.MapKey("DepartmentID"));    //指定員工表中DepartmentID爲Staff到Department的外鍵

指定屬性映射的字段爲Unicode類型:

modelBuilder.Entity<ClassA>() 
    .Property(t => t.Name) 
    .IsUnicode(true); 

設置屬性映射的列的類型:

modelBuilder.Entity<Department>() 
    .Property(p => p.Name) 
    .HasColumnType("varchar");            //設置列爲varchar類型

設置複雜類型的屬性(何爲複雜類型? 沒指定主鍵的類型):

modelBuilder.ComplexType<Details>() 
    .Property(t => t.Location) 
    .HasMaxLength(20);
modelBuilder.Entity<OnsiteCourse>() 
    .Property(t => t.Details.Location) 
    .HasMaxLength(20);

顯示設定爲複雜類型:

modelBuilder.ComplexType<ClassA>();

 

將屬性配置爲用作樂觀併發令牌:

方法1、用 ConcurrencyCheck 特性或 IsConcurrencyToken 方法

modelBuilder.Entity<OfficeAssignment>() 
    .Property(t => t.Timestamp) 
    .IsConcurrencyToken();

 

方法2、IsRowVersion 

modelBuilder.Entity<OfficeAssignment>() 
    .Property(t => t.Timestamp) 
    .IsRowVersion();

 

忽略類型,不映射到數據庫中:

modelBuilder.Ignore<OnlineCourse>();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章