C# 对于每一组操作,是可重用的ObjectContext还是新的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
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éphaneObjectContext是“工作单元” 本质上,这意味着对于每个“操作”(例如:每个网页请求),都应该有一个新的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奥特尽可能地活着。