1

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にエンティティを追加。..

しかし、私はプロパティを移動する場合は、サブクラスにAnimeDIrectionAnimeDirectionEnumTextListItemElement、操作はエラーなく成功します...私はプロパティを共有する3つの他のサブクラスを持っています(実際に共有するベースクラスには2つのルックアッププロパティがありますので、プロパティを移動することはお勧めできませんサブクラス)...

これはEF 4.2のバグであるか、私の基底クラスが抽象クラスであるためです(Microsoftは

答えて

0

これらの2つの質問は完全に無関係なので、一緒に聞かれるべきではありません。 2番目の質問は、問題の重要な部分が欠落していて実際の再現可能なコードが明らかになっていないため、エンティティをどのように追加/追加するのかを示すコードサンプルとともに個別に尋ねる必要があります。

最初の質問への回答:不可能です。基底クラスの一部がマップされると、それを派生クラスで無視することはできません。派生クラスは、基本クラスにマップされたすべてのプロパティを含む必要があります。

+0

申し訳ありませんが、2番目の質問を削除してメッセージを再編集しました。なぜそれが削除されなかったのか分かりません...(私は編集で踏みつけて、2番目の質問を削除してから、再投稿しました。) –

+0

あなたの答えをありがとう。おそらくEFコアがDBマッピングをどのように決定するかの制限です。私が受け取るエラーはむしろ誤解を招きます(Idがマップされていないか無視されていることを示していますが、マップされていない他のプロパティ)。 データに固有のまたはプレゼンテーション固有の知識を持つビジネスエンティティ(データ転送オブジェクトの設計パターンを参照してください)(プレゼンテーションではMVC検証属性を参照してください)を嫌うことはありません。シリアライゼーション(xmlとバイナリのサポート)のために私が許して受け入れる唯一の属性について。 時間と忍耐ありがとう –

関連する問題