2016-11-18 31 views
3

4年前問了這個問題:EF Mapping to prefix all column names within a table我希望這些日子有更好的處理。將列名約定添加到EF6 FluentAPI

我正在使用EF6 Fluent API,我將調用Code First Without Migrations。我有波蘇斯我的模型,我的大部分數據庫列名被定義爲[SingularTableName]Field(例如,CustomerAddress DB列映射在客戶POCO地址字段)

表:

CREATE TABLE dbo.Customers (
    -- ID, timestamps, etc. 
    CustomerName NVARCHAR(50), 
    CustomerAddress NVARCHAR(50) 
    -- etc. 
); 

型號:

public class Customer 
{ 
    // id, timestamp, etc 
    public string Name {get;set;} 
    public string Address {get;set;}  
} 

模型構建器:

modelBuilder<Customer>() 
    .Property(x => x.Name).HasColumnName("CustomerName"); 
modelBuilder<Customer>() 
    .Property(x => x.Address).HasColumnName("CustomerAddress"); 

目標:

我真正喜歡的是要能說這句話的FluentAPI:

modelBuilder<Customer>().ColumnPrefix("Customer"); 
// handle only unconventional field names here 
// instead of having to map out column names for every column 

回答

2

隨着model-based code-first conventions這已經變得很簡單。只要創建一個實現IStoreModelConvention類...

class PrefixConvention : IStoreModelConvention<EdmProperty> 
{ 
    public void Apply(EdmProperty property, DbModel model) 
    { 
     property.Name = property.DeclaringType.Name + property.Name; 
    } 
} 

......它在OnModelCreating添加到約定:

modelBuilder.Conventions.Add(new PrefixConvention()); 
+0

謝謝。我快速瀏覽它,但稍後必須挖掘。問題:我沒有使用EDMX模型,只使用POCO和帶有db的流暢API配置初始化。如果沒有EDMX模型,這仍然適用(我問,因爲我看到了EdmProperty,我不熟悉這種模型)。 – jleach

+0

更重要的是,它可以*僅用於代碼優先:)但在後臺,EF始終構建EDM(實體數據模型),因此名稱爲EdmProperty。 –

+0

非常好。這看起來不錯 - 我其實並沒有期待這個答案,所以我很高興看到它! – jleach