0

エンティティを削除して再挿入した後、EF が参照をうまく処理していないようです。以下のコードでなんとか再現できました(コメントで話しているものを除いて、すべてのアサートがパスすると仮定します):

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);


ここで何が起こっているのか誰か教えてもらえますか?

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

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; }
}
4

2 に答える 2

1

とにかく、削除と再挿入とは何の関係もないことがわかりました。それはとても明白でした...

熱心にロードされておらず、遅延ロード機能を持たないPOCOを使用して挿入していました...

プロキシを期待していた同じレコードを 2 回目にクエリしましたが、POCO が EF によってキャッシュされたようで、それが返されたものであり、熱心な読み込みや遅延読み込みがまだ行われていないことを意味します。

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

于 2012-01-14T10:21:15.773 に答える
0

これを考えると

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

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

また、後で .SaveChanges() を使用しないでください

database.Info.Remove(info);

?

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

于 2012-01-12T22:02:32.673 に答える