EF CodeFirst生成データベースをオーバーライドします
-
09-10-2019 - |
質問
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)
}
}
私のユニットテストはすべて、予想どおりに機能します。ただし、Table EntityAttributeはDonoridおよびGrantid列でレンダリングされます。このシナリオに使用される他の数十の「エンティティタイプ」が実際にあるので、私はこれを望んでいません。そのため、EntityTypeenumクラスを選択しました。
私は何が間違っているのですか?または、別の方法があるので、これらをマッピングする必要があるので、EFは私が望むように物事を処理する必要があります。ありがとう。
解決
V4 CTP 5のように、EFは列挙をまったくサポートしていません。次のリリースに含まれる可能性があります。
そうは言っても、スキーマは私には(私にとっては、あなたの投稿からは明らかではなく、あなたの意図は異なるかもしれません) EAV 私の慰めのために。通常の理由で(Google it)私はこれらを嫌い、そのようなモデルを使用したくないでしょう enum
EFでのサポート。
列挙の代わりに別のエンティティタイプにマッピングしてみませんか?
「ここに私のビジネスニーズがあります。これに最適なスキーマは何ですか?」という形で質問する場合あなたはより良い答えを得るかもしれません。