【问题标题】:How to Add Table Prefix In Entity Framework Code First Globally?如何在实体框架代码中全局添加表前缀?
【发布时间】:2012-09-28 02:58:48
【问题描述】:

我想把数据库中的所有表都加上'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 ;

有人可以帮帮我吗?

【问题讨论】:

    标签: entity-framework


    【解决方案1】:

    现在我找到了实体框架 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));
        }
    

    【讨论】:

    • 这也能阻止名字的复数吗?
    • 非常感谢!
    【解决方案2】:
    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));
     }
    

    【讨论】:

    • 我已经尝试了您的第二个代码示例,但如果我离开 'base.OnModelCreating(modelBuilder);' 会出现错误但是,如果我在类型配置行之前或之后将其放入,则在添加迁移时,我的表不会更改脚手架中的名称。我正在尝试更改 AspNet 表的名称以添加新前缀.他们只是保持不变。
    【解决方案3】:

    这适用于 EF Core 3.1+

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

    foreach (IMutableEntityType entity in modelBuilder.Model.GetEntityTypes())
    {
       entity.SetTableName("PE" + entity.GetTableName());
    }
    

    【讨论】:

    • 要使其与 EF core 3.1 一起使用,您需要添加对 Microsoft.EntityFrameworkCore.Relational 的包引用
    【解决方案4】:

    这适用于 EF Core 2.0+

    foreach (IMutableEntityType entity in modelBuilder.Model.GetEntityTypes())
    {                        
        entity.Relational().TableName = "PE" + entity.Relational().TableName;
    }
    

    【讨论】:

    • 这真的可以使用额外的上下文,比如@Bowyee 的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多