C# 初始化实体框架上下文的最佳方法?

C# 初始化实体框架上下文的最佳方法?,c#,entity-framework,C#,Entity Framework,初始化实体框架上下文时 一种是在类级别进行初始化,例如 public class EntityContactManagerRepository : ContactManager.Models.IContactManagerRepository { private ContactManagerDBEntities _entities = new ContactManagerDBEntities(); // Contact methods public Contac

初始化实体框架上下文时

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

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的背景来看,我更喜欢后面的initializein方法,但第一个来自于开发的示例。或者另一个问题,这有关系吗?

这有关系,因为上下文控制更改跟踪数据的生存期,并且还影响编辑对象时可以链接到一起的对象实例,因为两个不同上下文中的对象不能相互关联。在我看来,您正在共享的示例来自ASP.NET MVC应用程序。在本例中,我通常为每个请求使用一个实体上下文,因为请求是短期的,并且在更新请求中的对象时,通常需要获取其他对象并在它们之间创建关系

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


这似乎是“每个类一个上下文”选项的一个论点,但实际上并非如此。它更像是“每个工作单元一个上下文”的参数。一般来说:它是ASP.NET中每个请求的上下文,WinForms/WPF中每个窗口的上下文

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

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


有一篇很好的文章解释了这一点。

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