2

我想在我的实体类中使用 .Id 作为唯一 ID,但我们的 dba 想要数据库表中的 [tablename]Id。Entity Framework 有没有一种方法可以自动进行此映射,而无需为每个实体创建新的映射文件?

4

2 回答 2

3

只要我正确理解你,你就会有类似的东西:

public class Foo
{
    public Int32 ID { get; set; }
    // ...
}
public class Bar
{
    public Int32 ID { get; set; }
    // ...
}

而且,无需太多努力(或创建多个entityTypeConfiguration<T>模型),您就会想要以下结果:

Current Mapping                  Desired Mapping

[Foo]                            [Foo]
  ID                               FooID
  ...                              ...
[Bar]                            [Bar]
  ID                               BarID
  ...                              ...

为此,存在一些方法(取决于您使用的 EF 版本)。话虽如此,一些平易近人的策略:

列属性

您可以访问每个实体模型并使用ColumnAttribute. 这告诉 EF,尽管我们为该列命名,但我们希望其他名称成为数据库中的名称。例如

public class Foo
{
    [Column("FooID")]
    public Int32 ID { get; set; }
    // ...
}
public class Foo
{
    [Column("BarID")]
    public Int32 ID { get; set; }
    // ...
}

这里唯一的问题是您现在要访问每个模型并添加属性。

OnModelCreating & Fluent 映射

另一种方法是进行映射,但将其全部保存在一个地方。这个OnModelCreating活动非常适合这种事情。

public class MyDbContext : DbContext
{
    public Dbset<Foo> Foos { get; set; }
    public DbSet<Bar> Bars { get; set; }

    protected override void OnmodelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Foo>()
            .Property(x => x.ID).HasColumnName("FooID");
        modelBuilder.Entity<Bar>()
            .Property(x => x.ID).HasColumnName("BarID");
    }
}

同样,这里的问题是您正在为每个实体创建配置。

自定义约定

从 EF6 开始,您可以使用使事情变得更容易的自定义约定(包括开发自己的约定以使ID= TableNameID)。不幸的是,我没有时间写一个例子,但文档非常有启发性。

于 2013-08-20T17:23:43.143 回答
3

根据 MSDN ,两种方式都应该有效。

主键检测不区分大小写。公认的命名模式按优先顺序排列:'Id' [type name]Id

于 2013-08-20T15:06:04.017 回答