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

时间:2009-06-30 13:34:32

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

3 个答案:

答案 0 :(得分:30)

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

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

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

答案 1 :(得分:7)

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

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

答案 2 :(得分:2)

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

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