14

我想在数据库中添加前缀为“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 ;

任何人都可以帮助我吗?

4

4 回答 4

25

现在我找到了实体框架 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));
    }
于 2012-10-19T03:39:49.227 回答
13
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));
 }
于 2013-09-04T03:44:46.443 回答
5

这适用于 EF Core 3.1+

添加对包的引用Microsoft.EntityFrameworkCore.Relational

foreach (IMutableEntityType entity in modelBuilder.Model.GetEntityTypes())
{
   entity.SetTableName("PE" + entity.GetTableName());
}
于 2019-12-11T00:49:40.467 回答
3

这适用于 EF Core 2.0+

foreach (IMutableEntityType entity in modelBuilder.Model.GetEntityTypes())
{                        
    entity.Relational().TableName = "PE" + entity.Relational().TableName;
}
于 2018-08-24T12:25:00.373 回答