【问题标题】:How entity framework track the loaded entities? what are their life cycle?实体框架如何跟踪加载的实体?他们的生命周期是什么?
【发布时间】:2012-10-18 15:00:39
【问题描述】:

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

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

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

请EF专家详细解释一下以上几点。

提前致谢。

【问题讨论】:

标签: entity-framework


【解决方案1】:

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

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

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

【讨论】:

  • 感谢 StriplingWarrior 的快速回复。所以在 N-tie 企业架构中,我们没有办法让上下文保持活跃,虽然上下文不是线程安全的,但在这种情况下,EF 和数据库之间必须频繁加载和释放,如果与 ADO.NET 相比?
【解决方案2】:

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

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

当控制脱离上下文时,这些实体是消失了还是仍在内存中?在 .SaveChanges 之后,那些实体消失了吗?什么是生活 循环?

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

所以,最大的问题是:

EF 应该在何时何地生活?

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

在我的特定场景中,我使用像 Windsor 这样的 IoC 容器,它为我完成了繁重的工作。例如,在 ASP.NET MVC 应用程序中,Windsor 可以为每个 Web 请求创建一个上下文。有了这个,您不必在整个代码中编写大量 using 语句。您可以在此处阅读更多信息:

Windsor Tutorial - Part Seven - Lifestyles


这是一个链接,直接从帮助微软构建框架的人那里得到更详细的解释:

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

【讨论】:

  • 感谢您提供非常有用的信息。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多