初始化实体框架上下文的最佳方法是什么?

c# entity-framework

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

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

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开发的例子。或者另一个问题,它是否重要?

一般承认的答案

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

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

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


热门答案

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

有一篇文章很好地解释了每个请求范例背景的原因: 实体框架对象上下文范围



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因