将列名称约定添加到 EF6 FluentAPI

Posted

技术标签:

【中文标题】将列名称约定添加到 EF6 FluentAPI【英文标题】:Add Column Name Convention to EF6 FluentAPI 【发布时间】:2017-04-02 04:11:51 【问题描述】:

这个问题是 4 年前在这里提出的:EF Mapping to prefix all column names within a table 我希望现在有更好的处理方式。

我正在使用 EF6 Fluent API,我将其称为 Code First without Migrations。我的模型有 POCO,并且我的大多数数据库列名称都定义为 [SingularTableName]Field(例如,CustomerAddress db 列映射到 Customers POCO 中的 Address 字段)

表格:

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

【问题讨论】:

【参考方案1】:

有了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());

【讨论】:

谢谢。我快速浏览了它,但稍后将不得不深入挖掘。问题:我没有使用 EDMX 模型,只是 POCO 和 db 初始化关闭的 fluent API 配置。如果没有 EDMX 模型,这是否仍然适用(我问是因为我看到了 EdmProperty,我不熟悉副手)。 更重要的是,它只能用于代码优先:) 但是在后台,EF 总是构建一个 EDM(实体数据模型),因此命名为 EdmProperty。 优秀。这看起来很棒 - 我真的没想到会有答案,所以我很高兴看到它! 添加这个后运行add-migration时我有一堆Name: Each property name in a type must be unique. Property name ... is already defined. @Toolkit 请提出一个新问题,以便提供所有必需的详细信息。

以上是关于将列名称约定添加到 EF6 FluentAPI的主要内容,如果未能解决你的问题,请参考以下文章

EF Fluent API上

将 EF6 Code First 字符串流畅地设置为 nvarchar(max)

微软跨平台ORM框架之EFCore — 约定与属性映射

Code First约定-Fluent API配置

Code First约定-Fluent API配置

ORM系列之二:EF 约定注释Fluent API