在Entity Framework中,是否可以将列自动映射到实体属性? ID => [表名] ID

时间:2013-08-20 14:52:40

标签: entity-framework entity-framework-5

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

2 个答案:

答案 0 :(得分:3)

根据MSDN,both way应该有效。

  

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

答案 1 :(得分: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

您可以访问每个实体模型并使用ColumnAttribute修饰ID属性。这告诉EF,尽管我们命名了列,但我们希望其他成为数据库中的名称。 e.g。

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

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

OnModelCreating&amp;流利的映射

另一种方法是进行映射,但将其全部保存在一个地方。 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)。不幸的是,我没有时间写一个例子,但docs非常具有启发性。