如何首先在全局实体框架代码中添加表前缀?

时间:2012-09-28 02:58:48

标签: entity-framework

我想在数据库中添加前缀为'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 个答案:

答案 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());
}