2012-01-12 11 views
0

私はバグに遭遇したと思います。エンティティを削除して再挿入した後、EFが参照をうまく処理していないようです。私は以下のコードでそれを再現することができた(と仮定し、すべての私はコメントでの話を1以外渡すアサート):

参照のままnull

var database = new TestEntities(); 

// select and delete the info record 
var info = database.Info.First(i => i.ID == 1); 
Assert.AreEqual(1, info.MemberID); 
// when i uncomment the line below the last Assert fails 
// Assert.IsNotNull(info.Member); 
database.Info.Remove(info); 

// add it again and persist it to the database 
database.Info.Add(new Info { 
    ID = 1, 
    MemberID = 1 
}); 
database.SaveChanges(); 

// should not be null ? EDIT: i guess i understand this becoming null 
Assert.IsNull(info.Member); 

// and even here its still null 
info = database.Info.First(i => i.ID == 1); 
Assert.IsNull(info.Member); 


誰もがここで起こっていただきました!教えてもらえますか?

EDIT: 私のエンティティは、まずデータベースを使用して生成され、imはDbContext/POCOジェネレータを使用して生成されます。この

var info = database.Info.First(i => i.ID == 1); 
Assert.AreEqual(1, info.MemberID); 

を考えると

public partial class Member 
{ 
    public Member() 
    { 
     this.Info = new HashSet<Info>(); 
    } 

    public int ID { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Info> Info { get; set; } 
} 

public partial class Info 
{ 
    public int ID { get; set; } 
    public int MemberID { get; set; } 

    public virtual Member Member { get; set; } 
} 
+0

遅延ロードをオフにしてみてください。 – cadrell0

+0

エンティティはどのように定義されていますか?最初にコードしますか?データベースから生成されますか? –

+0

@ cadrell0 - 私は怠惰な読み込みが必要なので、オプションではないことを恐れています。 – Fabian

答えて

1

削除と再挿入とは関係ないことが分かりました。それは...とても明らかだった

私は熱心にロードされず、任意の遅延読み込み機能を持っていないPOCOを使用して挿入した...私は期待していた同じレコードを照会

二度目プロキシが、EOCによってPOCOがキャッシュされているように見えます。それは、それがまだ熱心でない、または遅延ロードを意味するものではありません。

EFがキャッシュから2番目のクエリを取得せず、プロキシ(var info = database.Info.Create())を使用して挿入するか、クエリにメンバーを含める(database.Info.Include(i => i.Member).First(i => i == 1))ことを確認して修正できます。

0

はあなたがここにinfo.MemberIDするinfo.IDを比較しませんか? IDとMemberIDが実際に異なる可能性はありますか?

また、あなたは

database.Info.Remove(info); 

後.SaveChanges()を使用すべきではありませんか?

また、インスタンス化されていない場合、情報には.memberがありません。メンバーIDがinfo.MemberIdに等しい相関メンバーが存在しますか?

+0

私はこの混乱を理解しています。メンバーもID 1を持っています(そして、メンバーはデータベースに存在します)。 '.SaveChanges()'について '.Remove()'の後に残っていることは残念なことです。 – Fabian

関連する問題