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