关于实体框架上下文生命周期的问题我对ASP.NETMVC应用程序中实体框架上下文的预期生命周期有一些疑问。将上下文保留尽可能短的时间不是最好的吗?考虑以下控制器操作:publicActionResultIndex(){IEnumerable模型;使用(varcontext=newMyEntities()){model=context.MyTable;}返回视图(模型);上面的代码不起作用,因为在视图呈现页面时实体框架上下文已经超出范围。其他人如何构建上面的代码?让我们争论吧!我不同意MVC+EF的共识,即在整个请求中保持上下文有效是一件好事,原因有很多:性能提升低您知道创建新数据库上下文的成本是多少吗?嗯...来自MSDN的“DataContext很轻,创建起来并不昂贵”得到IoC错误,它看起来很好......直到你上线如果你设置你的IoC容器来处理你的上下文并且你弄错了,你真的错了。现在我已经两次看到IoC容器造成的大量内存泄漏并不总是正确处理上下文。对于正常水平的并发用户,直到服务器开始崩溃,您才会意识到自己弄错了。它不会在开发中发生,所以做一些负载测试!意外延迟加载您可以返回一个IQueryable的最新文章列表在主页上。有一天,要求别人在相应文章旁边显示评论数。所以他们在View中添加了一些简单的代码来显示评论计数...@foreach(vararticleinModel.Articles){@article.Title@article.Comments.Count()comments}看起来不错,工作也很好。但是您实际上并没有在返回的数据中包含评论,所以现在这将为循环中的每篇文章进行新的数据库调用。选择N+1问题。10篇文章=11次数据库调用。好的,所以代码是错误的,但这是一个容易犯的错误,所以它发生了。您可以通过关闭数据层中的上下文来防止这种情况发生。但是,在article.Comments.Count()上,代码是否因NullReferenceException而中断?是的,它迫使您编辑数据层以获取View层所需的数据。这是应该的。代码味道从视图访问数据库有一些问题。你知道IQueryable实际上并没有访问数据库,所以忘记那个对象吧。在离开数据层之前确保数据库被命中。所以你的代码的答案(在我看来)应该像这个数据层:publicListGetArticles(){Listmodel;using(varcontext=newMyEntities()){//举个例子,我假设你的“MyTable”是一个新闻文章表model=(frommtincontext.Articlesselectmt).ToList();//List中的数据,所以现在数据库已经被命中并且数据是最终的}returnmodel;}控制器:publicActionResultIndex(){varmodel=newHomeViewModel();//使用您查看所需的位进行分类model.Articles=_dataservice.GetArticles();//与_dataService的初始化方式无关returnView(model);一旦你完成了这个并理解了这一点,那么也许你可以开始尝试让IoC容器处理上下文,但绝对不是之前。警告我——我见过两次巨大的失败:)但老实说,做你喜欢的事,编程很有趣,应该是一个偏好问题。我只是告诉你我的。但是无论您做什么,都不要因为“所有酷孩子都在这样做”而开始在每个控制器或每个请求中使用IoC上下文。这样做是因为您真正关心它的好处并且了解它是如何正确完成的。我同意每个请求一个上下文,我们通常使用Ninject.InRequestScope绑定上下文,这非常有效,是:Bind().ToSelf().InRequestScope();枚举集合尽可能接近查询也是一种很好的做法,即:publicActionResultIndex(){IEnumerablemodel;使用(varcontext=newMyEntities()){model=(frommtincontext.MyTableselectmt).ToArray();}返回视图(模型);这将帮助您避免无意中向您的视图添加查询。首先,您应该考虑为不同的类分配数据库访问权限。其次,我最喜欢的解决方案是使用“每个请求一个上下文”(如果您使用的是MVC,我相信它是每个控制器一个上下文)。要求编辑:看看这个答案,也许它也会帮助你。请注意,我正在使用webforms,因此目前无法在MVC中对其进行验证,但它可能会对您有所帮助,或者至少会为您提供一些指导。https://stackoverflow.com/a/10153406/1289283此dbcontext的一些示例用法:publicclassSomeDataAccessClass{publicstaticIQueryableGetAllProducts(){退回产品;然后你可以这样做:publicActionResultIndex(){varproducts=SomeDataAccessClass.GetProducts();返回视图(产品);}简单吧?你再也不用担心处理上下文,只写你真正需要的代码。有些人喜欢通过添加UnitOfWork模式或IoC容器来更进一步……但我更喜欢这种方法,因为它很简单。可以使用LINQ的.ToList()扩展方法:以上是C#学习教程的全部内容:关于实体框架上下文生命周期的问题。如果对大家有用,需要进一步了解C#学习教程,希望大家多多分享关注——publicActionResultIndex(){使用(varcontext=newMyEntities()){model=(frommtincontext.MyTableselectmt).ToList();}返回视图(模型);}收藏不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
