C# 对于每一组操作,是可重用的ObjectContext还是新的ObjectContext?

C# 对于每一组操作,是可重用的ObjectContext还是新的ObjectContext?,c#,linq-to-entities,data-access-layer,objectcontext,C#,Linq To Entities,Data Access Layer,Objectcontext,我是实体框架的新手,在空闲时间我刚刚开始玩它。我的一个主要问题是关于如何处理ObjectContext 以下哪一项通常是首选/推荐的: 这个 public class DataAccess{ MyDbContext m_Context; public DataAccess(){ m_Context = new MyDbContext(); } public IEnumerable<SomeItem> GetSome

我是实体框架的新手,在空闲时间我刚刚开始玩它。我的一个主要问题是关于如何处理ObjectContext

以下哪一项通常是首选/推荐的:

这个

public class DataAccess{

    MyDbContext m_Context;

    public DataAccess(){
        m_Context = new MyDbContext();        
    }

    public IEnumerable<SomeItem> GetSomeItems(){
        return m_Context.SomeItems;
    }

    public void DeleteSomeItem(SomeItem item){
        m_Context.DeleteObject(item);
        m_Context.SaveChanges();
    }
}
公共类数据访问{
MyDbContext m_Context;
公共数据访问(){
m_Context=new MyDbContext();
}
公共IEnumerable GetSomeItems(){
返回m_Context.SomeItems;
}
公共void DeleteSomeItem(SomeItem项目){
m_Context.DeleteObject(项);
m_Context.SaveChanges();
}
}
还是这个?

public class DataAccess{

    public DataAccess(){ }

    public IEnumerable<SomeItem> GetSomeItems(){
        MyDbContext context = new DbContext();
        return context.SomeItems;
    }

    public void DeleteSomeItem(SomeItem item){
        MyDbContext context = new DbContext();
        context.DeleteObject(item);
        context.SaveChanges();
    }
}
公共类数据访问{
公共数据访问(){}
公共IEnumerable GetSomeItems(){
MyDbContext=新的DbContext();
返回context.SomeItems;
}
公共void DeleteSomeItem(SomeItem项目){
MyDbContext=新的DbContext();
删除对象(项);
SaveChanges();
}
}

请注意,这两个代码段的基本问题大致相同。这是我一直在研究的问题,因为您不想同时打开和关闭上下文(请参见第二个示例),您不确定是否可以信任Microsoft为您正确处理上下文

我所做的一件事是创建一个公共基类,该基类在其中延迟加载上下文,并实现基类析构函数以进行处理。这对于MVC框架之类的东西很有效,但不幸的是,这会导致必须将上下文传递到各个层,以便业务对象可以共享调用的问题


最后,我使用Ninject将这种依赖性注入到每一层中,并让它跟踪使用情况,如果您为运行长时间运行的进程保持相同的上下文,那么针对它执行大量查询,linq到sql(我没有针对linq到实体进行测试,但我想这是相同的问题)会变得非常慢(大约1000个简单查询后,一秒钟查询一次)。定期更新上下文可以解决此问题,而且成本不高

所发生的事情是,上下文跟踪您对其执行的每个查询,因此,如果不以某种方式重置,它将变得非常胖……另一个问题是它所占用的内存

因此,这主要取决于应用程序的工作方式,以及是否定期更新DataAccess实例,或者是否一直保持不变。 希望这有帮助


Stéphane

ObjectContext是“工作单元”

本质上,这意味着对于每个“操作”(例如:每个网页请求),都应该有一个新的ObjectContext实例。在该操作中,应该重复使用相同的ObjectContext

考虑到事务和更改提交都绑定到ObjectContext实例,这一点很有意义

如果您不是在编写web应用程序,而是在编写WPF或windows窗体应用程序,那么它会变得更加复杂,因为您没有web页面加载所提供的严格的“请求”范围,但您知道这一点


PS:在您的两个示例中,ObjectContext的生命周期要么是全局的,要么是暂时的。在这两种情况下,它都不应该存在于DataAccess类中-它应该作为依赖项传递进来

,而我不赞成每次需要它们时总是创建复杂的对象,我也发现Linq to Sql中的AtaContext和EF中的ObjectContext最好在需要时创建

这两种方法都会基于运行它们的模型执行大量静态初始化,该模型会被缓存以供后续调用,因此您会发现上下文的初始启动时间比所有后续实例化时间都长


你面临的最大障碍是,一旦你从上下文中获得一个实体,你就不能简单地将它传递回另一个实体来执行更新操作,或将相关实体添加回。在EF中,你可以将实体重新附加回新的上下文。在L2S中,这个过程几乎是不可能的。

与此有点相关,尽管如此虽然讨论的是Linq2Sql,但同样适用。microsoft建议不要使用长时间运行的datacontext或objectcontext。这会降低性能并使对象跟踪变得复杂。因此,我总是在datacontext/objectcontext周围有一个using语句,并将所有数据操作推送到其中;我的上下文始终是sh奥特尽可能地活着。