14

「pe_」のようなプレフィックスを付けてデータベース内のすべてのテーブルを追加したい場合、クラスとテーブル間のマッピングは次のようになります: カテゴリ (pe_Category)、製品 (pe_Product) など。

1つのマップで、次のようにできることを私は知っています:

[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 アルファを使用したソリューションが見つかりました。

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 に答える