原文鏈接:https://www.entityframeworktutorial.net/entityframework6/custom-conventions-codefirst.aspx EF 6 Code-First系列文章目錄: 1 翻譯系列:什麼是Code First(EF 6 Code ...
原文鏈接:https://www.entityframeworktutorial.net/entityframework6/custom-conventions-codefirst.aspx
EF 6 Code-First系列文章目錄:
- 1 翻譯系列:什麼是Code First(EF 6 Code First 系列)
- 2.翻譯系列:為EF Code-First設置開發環境(EF 6 Code-First系列)
- 3.翻譯系列:EF Code-First 示例(EF 6 Code-First系列)
- 4.翻譯系列:EF 6 Code-First預設約定(EF 6 Code-First系列)
- 5.翻譯系列:EF 6中資料庫的初始化(EF 6 Code-First 系列)
- 6.翻譯系列:EF 6 Code-First中資料庫初始化策略(EF 6 Code-First系列
- 7.翻譯系列:EF 6中的繼承策略(EF 6 Code-First 系列)
- 8.翻譯系列: EF 6中配置領域類(EF 6 Code-First 系列)
- 9.翻譯系列:EF 6以及EF Core中的數據註解特性(EF 6 Code-First系列)
- 9.1 翻譯系列:數據註解特性之----Table【EF 6 Code-First 系列】
- 9.2 翻譯系列:數據註解特性之---Column【EF 6 Code First系列】
- 9.3 翻譯系列:數據註解特性之Key【EF 6 Code-First 系列】
- 9.4 翻譯系列:EF 6以及 EF Core中的NotMapped特性(EF 6 Code-First系列)
- 9.5 翻譯系列:數據註解之ForeignKey特性【EF 6 Code-First系列】
- 9.6 翻譯系列:數據註解之Index特性【EF 6 Code-First系列】
- 9.7 翻譯系列:EF數據註解特性之--InverseProperty【EF 6 Code-First系列】
- 9.8 翻譯系列:數據註解特性之--Required 【EF 6 Code-First系列】
- 9.9 翻譯系列:數據註解特性之--MaxLength 【EF 6 Code-First系列】
- 9.10 翻譯系列:EF數據註解特性之StringLength【EF 6 Code-First系列】
- 9.11 翻譯系列:數據註解特性之--Timestamp【EF 6 Code-First系列】
- 9.12 翻譯系列:數據註解特性之ConcurrencyCheck【EF 6 Code-First系列】
- 10.翻譯系列:EF 6中的Fluent API配置【EF 6 Code-First系列】
- 10.1.翻譯系列:EF 6中的實體映射【EF 6 Code-First系列】
- 10.2.翻譯系列:使用Fluent API進行屬性映射【EF 6 Code-First】
- 11.翻譯系列:在EF 6中配置一對零或者一對一的關係【EF 6 Code-First系列】
- 12.翻譯系列:EF 6 中配置一對多的關係【EF 6 Code-First系列】
- 13.翻譯系列:Code-First方式配置多對多關係【EF 6 Code-First系列】
- 14.翻譯系列:從已經存在的資料庫中生成上下文類和實體類【EF 6 Code-First系列】
- 15.翻譯系列:EF 6中的級聯刪除【EF 6 Code-First 系列】
- 16.翻譯系列:EF 6 Code -First中使用存儲過程【EF 6 Code-First系列】
- 17.翻譯系列:將Fluent API的配置遷移到單獨的類中【EF 6 Code-First系列】
- 18.翻譯系列:EF 6 Code-First 中的Seed Data(種子數據或原始測試數據)【EF 6 Code-First系列】
- 19.翻譯系列:EF 6中定義自定義的約定【EF 6 Code-First約定】
- 20.翻譯系列:Code-First中的資料庫遷移技術【EF 6 Code-First系列】
- 20.1翻譯系列:EF 6中自動數據遷移技術【EF 6 Code-First系列】
- 20.2.翻譯系列:EF 6中基於代碼的資料庫遷移技術【EF 6 Code-First系列】
- 21.翻譯系列:Entity Framework 6 Power Tools【EF 6 Code-First系列】
在前面的章節中,你以及學習了Code-First預設的約定。EF 6同樣也讓你自己定義自定義的約定,然後你的實體就會遵循這個自定義的約定的行為。
這裡有兩種類型的約定:配置約定(Configuration Conventions)和模型約定(Model Conventions).
配置約定
配置約定就是不重寫Fluent API提供實體的預設的行為,給實體進行配置。你可以在OnModelCreating方法中定義配置約定,還可以像Fluent API配置普通的實體映射那樣,在自定義的類中配置約定。
例如,如果你想要給屬性名稱為{實體名稱}_ID的屬性,配置主鍵,可以像下麵這樣:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder
.Properties()
.Where(p => p.Name == p.DeclaringType.Name + "_ID")
.Configure(p => p.IsKey());
base.OnModelCreating(modelBuilder);
}
同樣你可以定義數據類型的大小的約定【data type of size】
下麵的代碼,為string類型的屬性定義了一個約定。它將會創建nvarchar類型的列,大小是50。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder
.Properties()
.Where(p => p.PropertyType.Name == "String")
.Configure(p => p.HasMaxLength(50));
base.OnModelCreating(modelBuilder);
}
當然,你可以在單獨的類中,定義這些約定,這個自定義的類需要繼承自Convention類,例如:
public class PKConvention : Convention
{
public PKConvention()
{
.Properties()
.Where(p => p.Name == p.DeclaringType.Name + "_ID")
.Configure(p => p.IsKey());
}
}
添加完自定義的類,然後在OnModelCreating方法中這樣用:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Add<PKConvention>();
}
模型約定
模型約定是基於模型元數據的。這裡有關於CSDL和SSDL的約定,創建一個類,實現CSDL約定中的IConceptualModelConvention 介面,或者實現SSDL約定中的IStoreModelConvention
介面。
想要瞭解更多EF 6 自定義約定相關的,可以看看這篇文章: Custom Convention in EF 6 。