10

すべてのPOCOについて、ナビゲーションとコレクションのプロパティはすべてnullです。コード1番目の自動genプロキシクラスのナビゲーションとコレクションのプロパティがnull

いくつかの背景を教えてください。私はEF 4.3.1を使用して複雑なコードの最初のプロジェクトを持っています。プロキシの生成が無効になりました。コレクションとナビゲーションのプロパティは手動で管理されていました。

プロキシの作成と遅延ロードを有効にしました。デバッグすると、私のエンティティ(私の知られているPOCOタイプにキャストされている)が実際には自動生成されたプロキシクラスになっていることがわかります。ここまでは順調ですね。

ここで、ナビゲーションプロパティを見ると、nullになります。同様に、コレクションのプロパティはnullです。

リフレクションを使用すると、プロキシクラスHASがナビゲーションとコレクションのプロパティをオーバーライドしていることがわかります。

すべてのナビゲーションとコレクションのプロパティは仮想です。例えば:

public virtual NavigationType NavigationName { get; set; } 
public virtual ICollection<CollectionType> CollectionName { get; set; } 

また、すべてのテーブルは、次のような初期化されています

modelBuilder.Entity<TEntity>() 
.Map(m => 
{ 
    m.MapInheritedProperties(); 
    m.ToTable("TableName"); 
}); 

は私も期待通りのデータベースが生成されていることを確認することができます。外部キーはすべて存在し、予想されるフィールドに関連付けられています。

なぜnullですか?これをさらにどのように診断できますか?

+0

大きな質問です。 – mattytommo

+0

これらのコレクションのプロパティは、あなたのクラスで 'virtual'とマークされていますか? – alex

+0

要件を見てください - http://msdn.microsoft.com/en-gb/library/vstudio/dd468057(v=vs.100).aspx – devdigital

答えて

5

は、どのように私はこれをさらに診断することができますか?

たとえば、変更トラッカーのcontext.ChangeTracker.Entries()コレクションを調べることで、検査しているエンティティがコンテキストに関連付けられているかどうかを確認できます。

Entity entity = context.Entities.Create(); 

entityがプロキシになりますが、NavigationNameCollectionNamenullになり、彼らは場合でもnull滞在します:

は、それはあなたが、たとえば、すべてのナビゲーションプロパティがnullことで動的プロキシを持っていることも可能ですこれらのプロパティにアクセスします(NullReferenceExceptionにつながります)。エンティティをアタッチするときにのみ変更されます。

context.Entities.Attach(entity); 

このプロパティにアクセスすると、遅延ロードが実行されます。 NavigationNamenullデータベースに関連するエンティティがない場合、コレクションCollectionNameは添付してアクセスした後に決してnullにならないようにしてください。 DB内に関連するエンティティーがない場合、結果は空のコレクションになりますが、nullにはなりません。

+0

興味深い。私が取っている道は、あなたが言う通りです。それは私がコミットする準備ができるまで、.Create()を使用しますが、エンティティを.Attach(..)しません。私は今調査します。 –

+0

頭の爪。エンティティが最初に作成されたときの初期化は実装されていません。 Taは大変です! –

関連する問題