我想在数据库中添加前缀为'pe_'的所有表,然后类和表之间的映射将如下所示:Category(pe_Category),Product(pe_Product)等。
我知道只需一张地图,我就可以这样做:
[Table("pe_Category")]
public class Category
{
public int CategoryId { get; set; }
}
但我不喜欢它,因为可能有数百个实体。
所以我找到了一种全局添加前缀的方法,就像这样:
public class Category
{
public int CategoryId { get; set; }
}
public class Product
{
public int ProductId { get; set; }
}
// Global config, will affect all entities
table.Name = "pe_" + Class.TypeName ;
任何人都可以帮助我?
答案 0 :(得分:23)
现在我找到了实体框架6 alpha的解决方案:
1)创建一个名为“DefaultTableConvention”的类:
public class DefaultTableConvention
: IConfigurationConvention<Type, EntityTypeConfiguration>
{
public void Apply(
Type type,
Func<EntityTypeConfiguration> configuration)
{
configuration().ToTable("PE_" + type.Name);
}
}
2)在DbContext中,添加以下代码:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Add<DefaultTableConvention>();
}
就是这样,它会影响DbContext中添加的所有实体。详情:http://entityframework.codeplex.com/wikipage?title=Custom%20Conventions
<强>更新强> 现在使用EF6,有一种更简单的方法,称为“轻量级配置”,这里是代码:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Types().Configure(entity => entity.ToTable("PE" + entity.ClrType.Name));
}
答案 1 :(得分:12)
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entities().Configure(entity
=> entity.ToTable("PE" + entity.ClrType.Name));
}
仅适用于 ef6-beta-1 ; Microsoft将实体更改为 ef6-rc1
中的类型http://blogs.msdn.com/b/adonet/archive/2013/08/21/ef6-release-candidate-available.aspx#10444012
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Types().Configure(entity
=> entity.ToTable("PE" + entity.ClrType.Name));
}
答案 2 :(得分:1)
这适用于EF Core 2.0 +
foreach (IMutableEntityType entity in modelBuilder.Model.GetEntityTypes())
{
entity.Relational().TableName = "PE" + entity.Relational().TableName;
}
答案 3 :(得分:1)
此功能可用于EF Core 3.1 +
添加对软件包Microsoft.EntityFrameworkCore.Relational
的引用。
foreach (IMutableEntityType entity in modelBuilder.Model.GetEntityTypes())
{
entity.SetTableName("PE" + entity.GetTableName());
}