【问题标题】:Attaching one object to another without context在没有上下文的情况下将一个对象附加到另一个对象
【发布时间】:2012-07-11 13:46:55
【问题描述】:

我有两种使用 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
};

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      • 2021-02-07
      • 2017-02-01
      相关资源
      最近更新 更多