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


谁能告诉我这里发生了什么?

编辑:我的实体首先使用数据库生成,我使用 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 插入......

我第二次查询相同的记录时,我期待一个代理,但似乎 POCO 已被 EF 缓存,这就是它返回的意思,这意味着仍然没有急切或延迟加载。

我可以通过确保 EF 不从缓存中检索第二个查询、使用代理 ( 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 可用。是否存在 MemberID 等于 info.MemberId 的相关成员?

于 2012-01-12T22:02:32.673 回答