2011-01-10 7 views
0

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

は私の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は私が望むように物事を処理します。ありがとう。

答えて

1

The EF doesn't support enums at all, as of V4 CTP 5. They might be included in the next release.

(私には、それはあなたのポストから明らかではない、とあなたの意図は異なる場合があります)スキーマルックス、と言った私の快適さのためEAVに近すぎます。通常の理由(Googleのそれ)で私はこれらを嫌い、EFでenumのサポートをしてもそのようなモデルは望んでいないだろう。

なぜ列挙型ではなく別のエンティティ型にマップされますか?

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

+1

あなたが示唆したように私はEAVに向かっていると思います。私は効率的であるように努力していました。属性テーブルに多数のエンティティがマップされている場合、各エンティティ/属性の組み合わせごとに別々のマッピングテーブルを提案するか、1つのマッピングテーブル内の複数のエンティティID列を提案してください。これの欠点は、私はヌルがたくさんあると思います。また、質問の枠組みの提案に感謝します。 – trevorc

+0

ヌルがたくさん問題になることはありません。たとえば、SQL Server 2008以降では、サーバーに「ほとんどのNULLを最適化する」ことを伝える列「SPARSE」を宣言できます。 –

+0

ああ、1つのテーブルと多くのテーブルについて、EFでTPHとTPTの継承モデリングを比較してください。継承*を行っていないにもかかわらず、パフォーマンスの考慮事項は同じです。 –

関連する問題