簡體   English   中英

實體框架復雜類型的列命名約定

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM