[英]Entity Framework complex type's columns naming convention
使用復雜類型,默認列命名約定使用下划線。 這意味着以這種方式定義類型:
[ColmplexType]
public class Contact
{
string Email {get;set;}
string Post {get;set;}
}
public EntityN
{
//...
public Contact Contact {get;set;}
}
我們將獲得以這種方式命名的列
Contact_Email nvarchar(max)
Contact_Post nvarchar(max)
我們當然可以使用ColumnAttribute或Context.Properties映射分別配置每個列名,但是我們是否有可能創建命名約定,因此為currnet類型配置一次所有名稱?
對於一些復雜的類型,我寧願不提及屬性名稱(“Contact”),其他人使用CammelCase連接名稱和屬性,並且永遠不會使用undersore。
討論:
這工作(創建特定表的配置信息)
public class CustomComplexTypeAttributeConvention : ComplexTypeAttributeConvention
{
public override void Apply(ConventionTypeConfiguration configuration, ComplexTypeAttribute attribute)
{
Properties().Where(pi => pi.DeclaringType == typeof(Contact))
.Configure(p => p.HasColumnName(p.ClrPropertyInfo.Name)
);
base.Apply(configuration, attribute);
}
}
和OnModelCreating
modelBuilder.Conventions.AddBefore<ComplexTypeAttributeConvention>(new CustomComplexTypeAttributeConvention());
它有效,但我不確定它是一種正確的編碼方式:1)“AddBefore”是否按預期工作(我不想刪除默認行為,只想覆蓋一個案例的默認行為)? 2)將“自定義代碼”放入Apply方法或構造函數的最佳選項。
ComplexTypeAttributeConvention的斷點和反匯編帶來了一個想法,即我們不會覆蓋“默認”命名約定,而是通過“所有類型的所有屬性”使用“循環”。
這看起來像最可靠的解決方案,但它仍然是一個“黑客”(它不會覆蓋默認的“下划線”約定,但模擬“ColumnAttribute”的呈現):
public class BriefNameForComplexTypeConvention<T> : Convention
{
public BriefNameForComplexTypeConvention()
{
Properties().Where(pi => pi.DeclaringType == typeof(T))
.Configure(p => p.HasColumnName(p.ClrPropertyInfo.Name)
);
}
}
// ...
modelBuilder.Conventions.Add(new BriefNameForComplexTypeConvention<Contact>());
我之前從未這樣做過,但是值得嘗試一下ComplexTypeAttributeConvention
,你可以刪除默認的並將自定義的一個添加到DbModelBuilder.Conventions
:
public class CustomComplexTypeAttributeConvention : ComplexTypeAttributeConvention {
public CustomComplexTypeAttributeConvention(){
Properties().Configure(p => p.HasColumnName(p.ClrPropertyInfo.Name));
}
}
protected override void OnModelCreating(DbModelBuilder modelBuilder){
modelBuilder.Conventions.Remove<ComplexTypeAttributeConvention>();
modelBuilder.Conventions.Add(new CustomComplexTypeAttributeConvention());
//...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.