VS2013,EF6代码优先,MVC,(VB)
我想更好地理解使用单个上下文或将DbSets拆分为多个上下文的优缺点.我一直在阅读多个DbContexts上的一些旧SO帖子,并没有找到我想要的东西; 关于何时何地使用或不使用多个DbContexts的综合声明.
对于单个用户在自己的硬件上运行Windows Forms等程序的情况,似乎没有理由为了便于使用代码而有多个上下文.
对于运行多个企业的主要业务程序的Web应用程序,似乎多个DbContexts对于安全性和管理至关重要.
但是如果我正确地考虑这个问题,我想得到确认.我能想到的只有以下几点,但后来我对这个环境很陌生:
单一背景的优点:
编码只有一个上下文要处理
(跨上下文的关系是否存在问题?)
迁移更容易,因为只有一个迁移文件夹和进程
更容易获得在SSMS或EDMX中构建的综合图表
(链接此处首先使用代码时获取EDMX图表)
单一背景的缺点:
对于企业应用程序上的多个Web客户端,安全性可能是一个问题
(对于拥有简单会员资格的简单网站,这是一个问题吗?)
一些SO帖子似乎表明响应时间是一个问题
(这里的机制是什么?)
这就是我的全部.我完全不了解双方,并且鉴于我们可以使用的环境不同,看起来一个或多个环境的答案会有所不同.
我目前正在开发一个拥有会员资格的网站,还有一个可下载的应用程序,它将是一个在用户硬件上运行的个人应用程序.在这种情况下,我认为两者的单一上下文都是有道理的,但在我深入研究之前,我会要求对此进行一些讨论.我认为对环境有所了解的其他人将继续遇到同样的问题.
我还注意到微软认为适合在EF6及更高版本中为EF添加多个上下文功能,所以显然必须有一些编程环境能够产生令人信服的理由来拥有多个上下文.
感谢您的投入.
最诚挚的问候,艾伦
在我看来,拥有多个上下文的唯一理由是,如果您有多个数据库在运行.例如,我使用的一个应用程序有3个上下文.两个上下文适用于应用程序不直接负责的现有数据库,而第三个上下文是具有迁移的特定于应用程序的上下文.
拆分上下文没有什么好处.Erik建议大型上下文存在性能问题,但我已经使用了包含50多个对象集的单个上下文,并且完全没有注意到性能问题.
然而,另一方面,使用多个上下文确实有害.首先,您无法无缝地处理多个对象,除非它们都位于相同的上下文中.此外,由于Entity Framework的对象图跟踪,多个上下文往往会混淆绿色开发人员.例如,假设您有两个实体,Foo
并且Bar
都在不同的上下文中.如果您创建了与Bar
on 的关系Foo
:
public class Foo { public virtual Bar Bar { get; set; } }
好吧,猜猜怎么着?无论Foo
和 Bar
现在被跟踪Foo
的上下文.如果您然后尝试在两个上下文中运行迁移,那么您将收到错误,因为它Bar
是在两个上下计算的,计数'em,两个上下文.
像这样的错误很容易制造,你会疯狂地试图让一切完全被排除在外.另外,我的论点一直是,如果你的项目中有实体可以完全排除其他实体,那么这就是一个完全独立的项目的论证,而不仅仅是一个不同的上下文.
我在评论中看到您提到学习域驱动设计。DDD中的概念之一是绑定上下文(一定要检查气泡上下文中的链接资源,以了解如何处理共享实体的两个上下文)。
它使绝对意义上使用每个单独的DbContext映射你的限界上下文。在执行此操作时,您需要警惕某些陷阱,但是遵循DDD方法应该可以帮助您避免这些陷阱。主要对象是共享实体。一个上下文应负责控制共享实体的生命周期,另一上下文应仅查询那些实体,而不对它们进行任何更改。
将您的域划分为有限的上下文将使您可以更轻松地管理大型/复杂域。如果您不需要,也可以避免不必要地加载域的某些部分(在SOA中,您可以将每个有界上下文作为服务自动部署为Udi Dahan称为“ 自治业务组件”)。
除非必须,否则我不主张进行拆分。例如,多个团队同时处理域的不同部分可能会提供一个很好的机会进行拆分,但是在某个时候这样做绝对是有意义的。