没有上下文将一个对象附加到另一个

时间:2012-07-11 13:46:56

标签: c# .net entity-framework entity-framework-4 objectcontext

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

  

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

我想这一定是因为在分离对象之前已经处理了使用块。是否有任何方法可以1)在上下文处理后将其分离,或者2)将它传递给ghost上下文,直到我将其传递回数据层?

这是我的代码:

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

1 个答案:

答案 0 :(得分:2)

回答你的两个问题是:不。在为两个操作使用相同的上下文或在离开using块的范围之前分离您的实体。

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

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