0

EF CodeFirstアプローチを使用するC#プロジェクトがあります。私の問題は、EFが私のクラスをどのように解釈し、データベーステーブルを生成するかです。EFはあまりにも多くのことを推測していて、結果のdbは私が望む方法ではありません。具体的には、マッピングクラスの1つに追加のid列を生成しています。

これが私のPOCOクラスです:

    public partial class Attribute
    {
    public int Id {get;set;}
    public string Name {get;set;}
    public virtual ICollection<EntityAttribute> EntityAttributes {get;set;}
    }

    public partial class Grant
    {
    public int Id {get;set;}
    public string Name {get;set;}
    public virtual ICollection<EntityAttribute> EntityAttributes {get;set;}
    }

    public partial class Donor
    {
    public int Id {get;set;}
    public string Name {get;set;}
    public virtual ICollection<EntityAttribute> EntityAttributes {get;set;}
    }

    public enum EntityTypeEnum
    {
    Grant = 1,
    Donor = 2
    }

    public partial class EntityAttribute
    {
    public int Id {get;set;}
    public int EntityId {get;set;}
    public int AttributeId {get;set;}
    public int EntityTypeId {get;set;}
    public EntityTypeEnum EntityType
    {
       get{return (EntityTypeEnum)this.EntityTypeId;}
       set{this.EntityTypeId = (int)value;}
    }
    public virtual Grant Grant {get;set;}
    public virtual Donor Donor {get;set;}
}

私のマッピングクラスは典型的ですが、ここにEntityAttributeMapクラスがあります:

public partial class EntityAttributeMap : EntityTypeConfiguration<EntityAttribute>
{
public EntityAttributeMap()
{
this.ToTable("EntityAttribute");
this.HasKey(ea => ea.Id);
this.Property(ea => ea.EntityTypeId).IsRequired();
this.Ignore(ea => ea.EntityType);

this.HasRequired(ea => ea.Grant)
    .WithMany(g => g.EntityAttributes)
    .HasForeignKey(ea => ea.EntityId);

this.HasRequired(ea => ea.Donor)
    .WithMany(d => d.EntityAttributes)
    .HasForeignKey(ea => ea.EntityId);

this.HasRequired(ea => ea.Attribute)
    .WithMany(a => a.EntityAttributes)
    .HasForeignKey(ea => ea.AttributeId)
}
}

私の単体テストはすべて期待どおりに実行されます。ただし、テーブルEntityAttributeは、DonorId列とGrantId列でレンダリングされます。このシナリオで使用される他の「EntityTypes」が実際に数十あるので、これは必要ありません。そのため、EntityTypeEnumクラスを選択しました。

私は何が間違っているのですか?または、EFが希望どおりに処理するように、これらをマッピングする別の方法はありますか。ありがとう。

4

1 に答える 1

1

V4 CTP 5 の時点で、EF は列挙型をまったくサポートしていません。これらは次のリリースに含まれる可能性があります。

そうは言っても、スキーマは(私には;あなたの投稿からは明らかではなく、あなたの意図は異なるかもしれません)、私の快適さのためにEAVに近すぎます。enum通常の理由 (Google で検索) から、私はこれらが嫌いであり、EFでサポートされていても、そのようなモデルは必要ありません。

列挙型の代わりに別のエンティティ タイプにマップしないのはなぜですか?

「これが私のビジネス ニーズです。これに最適なスキーマは何ですか?」という形式で質問するとします。より良い答えが得られるかもしれません。

于 2011-01-10T22:15:14.957 に答える