【问题标题】:Best way to initialize an entity framework context?初始化实体框架上下文的最佳方法?
【发布时间】:2009-06-30 13:34:32
【问题描述】:

初始化实体框架上下文时。

一种是在类级别初始化,比如

public class EntityContactManagerRepository
    : ContactManager.Models.IContactManagerRepository
{
    private ContactManagerDBEntities _entities = new ContactManagerDBEntities();

    // Contact methods
    public Contact GetContact(int id)
    {
        return (from c in _entities.ContactSet.Include("Group")
                where c.Id == id
                select c).FirstOrDefault();
    }
}

另一种方式是在方法级别进行初始化。

public class EntityContactManagerRepository
    : ContactManager.Models.IContactManagerRepository
{    
    // Contact methods
    public Contact GetContact(int id)
    {
       using (var entities = new ContactManagerDBEntities())
           return (from c in entities.ContactSet.Include("Group")
               where c.Id == id
               select c).FirstOrDefault();
    }
}

从 Ado.Net 的背景来看,我更喜欢后面的 one-initialize in 方法,但第一个是来自Stephen Walthe 开发的示例。或者另一个问题,这有关系吗?

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    这很重要,因为上下文控制着更改跟踪数据的生命周期,并且还会影响您在编辑对象时可以将哪些对象实例链接在一起,因为两个不同上下文中的对象不能相互关联。在我看来,您分享的示例来自 ASP.NET MVC 应用程序。在这种情况下,我通常为每个请求使用一个实体上下文,因为请求是短暂的,而且由于在更新请求中的对象时,必须获取其他对象并在它们之间创建关系是很常见的。

    另一方面,您不希望将实体上下文保留很长时间,因为它会在跟踪越来越多的对象的更改时消耗内存。

    这似乎是“每个类一个上下文”选项的论据,但实际上并非如此。它更像是“每个工作单元一个上下文”的论点。

    【讨论】:

    • 感谢您的回复。 “我通常每个请求使用一个实体上下文,因为请求是短暂的。”听起来您也更喜欢它进入方法级别,因为它绑定到请求。
    • 我不在方法级别这样做,因为“每个请求的方法”是一个控制器操作,而我的控制器不知道对象上下文。对我来说,上下文是在服务中实例化的,该服务创建控制器所需的存储库。但你已经有了大致的想法。
    • 通常我所做的是有一个帮助类,它返回一个上下文的实例,它在请求的生命周期内一直存在。您可以在当前 HttpContext (HttpContext.Current) 中存储对它的引用。
    • 从您的评论中,我了解到您确实在服务的类级别(而不是方法级别)初始化了上下文,因为您会在每次请求时在控制器内部执行 new MyServiceClass()。我说的对吗?
    • @BornToCode 我只是将其设置为 DI 组合根中的请求范围。
    【解决方案2】:

    一般来说:在 ASP.NET 中是每个请求的上下文,在 WinForms/WPF 中是每个窗口的上下文。

    有一篇文章很好地解释了每个请求范例的上下文背后的推理: Entity Framework Object Context Scope

    【讨论】:

      【解决方案3】:

      嗯,“最好”的方式总是主观的。但是,将 UnitOfWorkScope 类添加到项目中可以大大简化事情 - 即您不必过多考虑创建对象上下文或将工作单元持久化回数据库。

      有一篇很棒的文章解释了How To Create a Unit of Work Scope

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 2018-03-09
        • 1970-01-01
        • 2011-11-24
        • 1970-01-01
        相关资源
        最近更新 更多