2016-11-18 74 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