实体框架如何跟踪加载的实体?他们的生命周期是什么?

时间:2012-10-18 15:00:39

标签: entity-framework

我对实体框架相对较新,我能找到的所有文档或书籍都在谈论如何使用框架,或者应该使用哪种模型,但缺乏对框架如何深入工作的解释。

例如,当我通过LINQ查询或框架方法从数据库加载实体时,这些实体是否安全?换句话说,他们可以与其他线程共享吗?如果是这样,EF如何控制一致性?

当控件脱离上下文时,这些实体是否已经消失或仍在内存中?之后.SaveChanges那些实体消失了吗?什么是生命周期?

请EF的专家详细解释上述要点。

提前致谢。

3 个答案:

答案 0 :(得分:2)

加载实体的生命周期或多或少与加载它们的实体上下文的生命周期相关联。因此,在许多示例中,您将看到:

using (var ctx = new Context())
{
    // ... do work
}   // The context gets disposed here.

一旦处理了上下文(例如,在using语句的末尾),您就不应再处理在上下文中加载的实体,就像您可以从中加载其他信息一样。例如,不要尝试访问它们的导航属性。为了避免出现问题,我通常认为最好创建一个DTO,它只包含我希望人们能够使用的确切数据,并且这是唯一留下using语句的值。

using (var ctx = new Context())
{
    var q = from p in ctx.People
            select new PersonSummary{Name = p.Name, Email = p.Email};
    return q.ToList(); // This will fully evaluate the query, 
                       // leaving you with plain PersonSummary objects.
}

实体上下文不是线程安全的,因此您不应该尝试从绑定到相同上下文的对象的多个线程加载导航属性,即使在上下文的生命周期内也是如此。

答案 1 :(得分:2)

  

例如,当我通过LINQ查询或框架方法从数据库加载实体时,这些实体是否安全?在   另一个词可以与其他线程共享吗?如果是这样的EF   控制一致性?

ObjectContext类不是安全的。每个线程必须有一个对象上下文,或者创建自己的线程同步过程。这样,一致性由ObjectContext管理,因为它跟踪所有对象的状态。

  

当控件脱离上下文时,那些实体是否已经消失或仍在内存中?之后.SaveChanges那些实体消失了吗?生命是什么   周期?

ObjectContext类继承自IDisposable接口,因此您可以并且应该在使用Entity Framework时使用USING语句。这样,在关闭using语句后它们就消失了。如果您不要处置他们继续跟踪的上下文,则只会更改其状态。处置ObjectContext实例还将确保正确处理数据库连接,并且不会泄漏数据库连接。

所以,最大的问题是:

EF何时何地居住?

论文ORM应该被视为工作单元模式,也就是说,ORM对象应该存在,直到业务任务完成。

在我的特定场景中,我使用像IoC这样的 Windsor 容器,这对我来说非常重要。例如,在ASP.NET MVC应用程序中,Windsor可以创建每个Web请求的上下文。有了这个,您不必在整个代码中编写大量using语句。你可以在这里阅读更多相关信息:

Windsor Tutorial - Part Seven - Lifestyles


这是一个链接,可以直接从有助于在Microsoft构建框架的人那里更详细地解释它:

Entity Framework Object Context Life Cycle compared to Linq to Sql Data Context Life Cycle

答案 2 :(得分:0)

您可以编写测试应用程序来观察上下文跟踪器的行为。

如果从上下文中检索实体,然后处置该上下文,然后创建上下文的新实例并尝试将更改保存到您之前检索的实体,它会抱怨它已经跟踪了一个实体那个ID。