EF 4.2と流暢なAPIには、コードファーストデザインアプローチと基本クラスプロパティ継承(テーブルコンクリートタイプ)の2つの問題があります...EF 4.2と継承したクラス関連プロパティの問題点
1)ベースクラスのプロパティ(非プリミティブプロパティ)を無視するFluent APIは、EFエラーを引き起こします。
流暢なAPIの私のignore文は、私の基本クラスのプロパティで正しく処理されていないようです。流暢なAPIで
class BaseContentElement {
public virtual BaseContentElemnt Parent {get; set;}
public int Id {get;set;}
...
}
class ChapterElement : BaseContentElement {
public virtual CourseElement Course {
get { return base.Parent as CourseElement; } set {base.Parent = value; }
}
...
}
しかし、私が追加した場合、文の
var config = new EntityTypeConfiguration<ChapterElement>();
config.Map(m =>
{
m.MapInheritedProperties();
m.ToTable("Chapter", Schema);
});
config.HasKet(ch => ch.Id);
config.Ignore(ch => ch.Parent);
は... 'IDは' クラスChapterElement
で発見されていないというエラーを発生させるために
をEFの原因となりますBaseContentElement
のParentプロパティのデータアノテーション[NotMapped]、EFエンジンがappyでDBが作成されます。
2) KUPテーブルは、私はアプリがで動作します(すべてのルックアップテーブル値のメモリ内のルックアップテーブルを保つ私のアプリでは...重複キーの挿入で
public abstract class BaseListItemElement : BaseContentElement, IComparable
{
public int Id { get; set; }
public int Index { get; set; }
public virtual StaticContentBlockElement Item { get; set; }
public virtual eAnimationDirection AnimeDirectionEnum
{
get
{
if (AnimeDirection != null)
{
return AnimeDirection.EnumValue;
}
return eAnimationDirection.None;
}
set
{
AnimeDirection = AnimationDirection.Lookup[value];
}
}
public virtual AnimationDirection AnimeDirection { get; set; }
...
public class TextListItem : BaseListItemElement {
...
}
をエラーが発生します列挙型eAnimationDirection
で更新され、DBはAnimeDirection
プロパティで更新されます)。 DBContext
にレコードを追加する前に、ルックアップテーブルの各項目について、参照値をコンテキストDbContext.AnimationDirections.Attach(
...に付加します。
私は(ルックアップテーブルである)AnimationDirection
テーブルの上に重複挿入エラーを取得するDBにエンティティを追加。..
しかし、私はプロパティを移動する場合は、サブクラスにAnimeDIrection
とAnimeDirectionEnum
、TextListItemElement
、操作はエラーなく成功します...私はプロパティを共有する3つの他のサブクラスを持っています(実際に共有するベースクラスには2つのルックアッププロパティがありますので、プロパティを移動することはお勧めできませんサブクラス)...
これはEF 4.2のバグであるか、私の基底クラスが抽象クラスであるためです(Microsoftは
申し訳ありませんが、2番目の質問を削除してメッセージを再編集しました。なぜそれが削除されなかったのか分かりません...(私は編集で踏みつけて、2番目の質問を削除してから、再投稿しました。) –
あなたの答えをありがとう。おそらくEFコアがDBマッピングをどのように決定するかの制限です。私が受け取るエラーはむしろ誤解を招きます(Idがマップされていないか無視されていることを示していますが、マップされていない他のプロパティ)。 データに固有のまたはプレゼンテーション固有の知識を持つビジネスエンティティ(データ転送オブジェクトの設計パターンを参照してください)(プレゼンテーションではMVC検証属性を参照してください)を嫌うことはありません。シリアライゼーション(xmlとバイナリのサポート)のために私が許して受け入れる唯一の属性について。 時間と忍耐ありがとう –