初始化实体框架上下文时。
一种是在班级进行初始化,例如
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开发的示例。或者另一个问题,它是否重要?
答案 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。