私は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は私が望むように物事を処理します。ありがとう。
あなたが示唆したように私はEAVに向かっていると思います。私は効率的であるように努力していました。属性テーブルに多数のエンティティがマップされている場合、各エンティティ/属性の組み合わせごとに別々のマッピングテーブルを提案するか、1つのマッピングテーブル内の複数のエンティティID列を提案してください。これの欠点は、私はヌルがたくさんあると思います。また、質問の枠組みの提案に感謝します。 – trevorc
ヌルがたくさん問題になることはありません。たとえば、SQL Server 2008以降では、サーバーに「ほとんどのNULLを最適化する」ことを伝える列「SPARSE」を宣言できます。 –
ああ、1つのテーブルと多くのテーブルについて、EFでTPHとTPTの継承モデリングを比較してください。継承*を行っていないにもかかわらず、パフォーマンスの考慮事項は同じです。 –