将列名称约定添加到 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的主要内容,如果未能解决你的问题,请参考以下文章