我想在我的实体类中使用.Id作为唯一ID,但是我们的dba想要数据库表中的[tablename] Id。有没有一种方法可以让Entity Framework自动进行这种映射,而无需为每个实体创建新的映射文件?
答案 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非常具有启发性。