2016-07-05 4 views
0

は、以下の(非常に単純化された)エンティティを考えてみましょう:私のマッパーでEntity Frameworkの遅延ロード間違ったエンティティ

public class User 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class Answer 
{ 
    public int Id { get;set; } 
    public virtual User User { get; set; } 
    public string Text { get;set } 
} 

public class TeamMember 
{ 
    public int Id { get;set; } 
    public virtual User User { get; set; } 
    public string Role { get; set; } 
} 

変更が永続化される前に、私は(とすぐに次のコードが実行されると、ユーザーの罰金を設定することができますが、 teamMembersはTeamMembersのリストであり、あるCurrentUserは、DBからロードされたユーザエンティティである

if (teamMembers.Select(x => x.User).Contains(currentUser))

)DBには、回答のユーザプロパティは、データベースから以前の値に設定されています。 データベースからまだロードされていない前に、私はAnswerのUserプロパティにアクセスしていないので、これは何が起こっているのか(遅れて読み込まれていますか?)

マッパーで設定する前にユーザーを読むことで問題を解決できますが、私が理解できないのはTeamMemberのユーザープロパティにアクセスすると、回答のユーザープロパティが読み込まれて設定される理由です。両方のエンティティが同じユーザー(つまり、外部キーと同じUser_Idを持っているデータベース)に関連付けられているため、これは予想される動作ですか?TeamMembersに読み込むとき、EFはそれを参照する他のエンティティを巧みに読み込み、まだロードされていませんか?

答えて

0

エンティティは、参照を持つ要素によって格納されたりキャッシュされたりすることはありませんが、それぞれのコレクションとともに格納されます。

このユーザーをteamMembersの参照で読み込むと、ロードされた期間が表示されます。別の要素/オブジェクトから参照するときは、そのオブジェクトがすでにメモリに入っているときに再度読み込んでください。

これは、すべての設計であり、それは理にかなって...例えば、あなたは同時に、これらすべてのオブジェクトを保存したい場合など、それは最初に保存し、そのためのアイデンティティ/キーを取得し、ユーザーを作成します生成されたそのキーでそれを参照する他のオブジェクト。

REF:https://msdn.microsoft.com/en-us/data/hh949853.aspx#3

」同じキーを持つエンティティがすでにそのObjectStateManagerにロードされている場合 同じキーを持つエンティティが既に存在EFますあれば... ObjectContextをチェックします。 クエリの結果に含める。EFはまだデータベースに対してクエリを発行しますが、 この動作は、エンティティに 複数回マテリアライズのコストの大部分をバイパスすることができます。」お返事のための

+0

おかげで、それは完全に私の質問に答える(おそらく十分に明確ではありませんでした)しません。 User1 {}とUser2 {}の2人のユーザーがいるとしましょう。私は 'User1 {}'から 'User2 {}'に 'answer.User'の値を設定し、次にsaveを保存せずにselect(例:' teamMembers.Select(x => x) .User).Contains(currentUser) ')を私のteamMembersコレクションに追加すると、私の答えのUserプロパティが' User1 {} 'に戻ります。 – msokrates

+0

User2はすでにデータベースに保存されていますか、その時点では「メモリ内」ですか? –

+0

Answer.UserをUser2に設定しましたが、データベースから取得しましたが、この変更はまだ保存されていません。 – msokrates

関連する問題