0

我有两种使用 EF4 的方法 - 一种在 using 块中返回对象列表(页面),另一种方法创建不同类型的对象(书)。Book 上的一个属性是 FirstPage,它是第一个项目列表中的一个项目。当我尝试在此实例化对象上设置 FirstPage 属性时,出现异常:

无法定义这两个对象之间的关系,因为它们附加到不同的 ObjectContext 对象。

我想这一定是因为 using 块在对象被分离之前已经被释放。有什么方法可以 1)在处理完上下文后将其分离,或者 2)将其附加到幽灵上下文,直到我将其传递回数据层?

这是我的代码:

IEnumerable<Page> allPages = null;

using (var db = new DataContainer())
{
    var items = db.Pages;
    var filteredCode = items.Where(i => i.Code == PageCode);
    allPages = filteredCode.ToList();
}

Page page = allPages.FirstOrDefault(p => ...); // query omitted

var book = new Book()
{
    Title = @"asdas",
    FirstPage = page, // 'page' is never null
    // rest omitted
};
4

1 回答 1

2

你的两个问题的答案都是:不。要么对两个操作使用相同的上下文,要么在离开 using 块的范围之前分离实体。

如果您使用 POCO,您还可以关闭代理创建(=无延迟加载和动态更改跟踪)并且您的代码无需任何更改即可工作,因为代理保持对上下文的引用 - POCO 本身对上下文一无所知。

顺便提一句。EntityObject在超出其上下文的生命周期范围之前不分离实体(代理 POCO 和可能还有)还有另一个副作用- 它会导致内存泄漏,因为实体持有对上下文的引用,而上下文持有对许多其他对象的引用,包括其他附加对象实体。在您的实体被释放(没有对您的实体的引用)之前,垃圾收集器无法释放上下文和所有相关对象。

于 2012-07-11T13:53:46.757 回答