一个可重用的ObjectContext或一个新的ObjectContext?我是实体框架的新手,刚开始在空闲时间玩弄它。我遇到的一个主要问题是如何处理ObjectContext。这些通常是首选/推荐的:这个publicclassDataAccess{MyDbContextm_Context;publicDataAccess(){m_Context=newMyDbContext();}publicIEnumerableGetSomeItems(){返回m_Context.SomeItems;}publicvoidDeleteSomeItem(SomeItemitem){m_Context.DeleteObject(item);m_Context.SaveChanges();}}或这个?publicclassDataAccess{publicDataAccess(){}publicIEnumerableGetSomeItems(){MyDbContextcontext=newDbContext();返回context.SomeItems;}publicvoidDeleteSomeItem(SomeItemitem){MyDbContextcontext=newDbContext();context.DeleteObject(项目);context.SaveChanges();}}ObjectContext的意思是“工作单元”。基本上这意味着每个“操作”(例如:每个网页请求)都应该有一个新的ObjectContext实例。在该操作中,应重用相同的ObjectContext。当您考虑时,这是有道理的,因为事务和更改提交都与ObjectContext实例相关联。如果您不是在编写Web应用程序,而是WPF或Windows窗体应用程序,那么它会变得有点复杂,因为您没有网页加载为您提供的严格“请求”范围,但您明白了。PS:在您的任何一个示例中,ObjectContext的生命周期都是全局的或瞬态的。在这两种情况下,它不应该存在于DataAccess类中-它应该作为依赖项传递如果您为运行大量查询的长时间运行的进程保持相同的上下文,linq-to-sql(我没有测试linq-to-entities,但我想这是同一个问题)变得非常慢(大约1000个简单查询后每秒1个查询)。定期更新后台可以解决这个问题,而且成本也不高。发生的情况是上下文会跟踪您针对它所做的每个查询,因此如果它不以某种方式重置,它就会变胖……另一个问题是它需要的内存。因此,这主要取决于您的应用程序的工作方式,以及您是否定期创建新的DataAccess实例,或者是否始终保持相同。希望这可以帮助。Stefan快速说明一下——这两个代码在它们的根本问题上大致相同。这是我一直在关注的内容,因为您不想继续打开和关闭上下文(参见第二个示例),同时您不确定是否可以信任Microsoft会为您正确处理上下文。我做的一件事是创建一个公共基类,它延迟加载Context并实现一个基类析构函数来处理事情。这适用于MVC框架之类的东西,但不幸的是会导致必须将上下文传递到各个层以便业务对象可以共享调用的问题。最后,我使用Ninject将一些内容注入每一层并使其跟踪使用情况虽然我不赞成每次需要时都创建,但必须是复杂的对象——我还在LinqtoSql和EF中找到了DataContextsObjectContext最好在需要时创建。这两者都根据您运行它们的模型执行大量静态初始化,这些模型被缓存以供后续调用使用,因此您会发现上下文的初始启动将比所有后续实例花费更长的时间。你面临的最大障碍是,一旦你从上下文中得到一个实体,你就不能简单地将它传递回另一个实体进行更新操作,或者重新添加相关实体。在EF中,您可以将实体重新附加到新上下文。在L2S中,这个过程几乎是不可能实现的。以上就是C#学习教程:每组操作是reusableObjectContext还是newObjectContext?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
