我应该在多个实体框架有界上下文中添加相同的表吗?

5
我有一个相当大的数据库,约80个表。因此,我决定将表分成有界上下文,而不是在一个大的edmx文件中拥有所有80张表。
所以我有像销售、客户等有界上下文。
我在我的Customers edmx文件中有我的主要客户表。然而,我还需要从Sales edmx上下文中访问某些字段,不是全部,只是1或2个字段(例如,我只需要客户名称,而不是整个客户对象/表)。
我必须将整个客户表添加到Sales edmx文件中吗?对于这种情况,最佳实践是什么?
3个回答

10

我喜欢Julie Lerman在这个话题上的观点 http://msdn.microsoft.com/en-us/magazine/jj883952.aspx

我使用有界上下文来提高访问性能,因为使用较小的dbcontext时,即使使用生成的视图,上下文的加载时间也更快。简化访问模型是很好的额外收益。 有关性能方面的提示,请参阅MS ef网站:http://msdn.microsoft.com/en-us/data/hh949853

BCs还可以带来其他好处,如限制访问以匹配业务问题。 如果您尝试使用不仅在哪些DBSet出现上不同的db contexts,并且尝试更改Model views,则会出现更大的问题。我认为最好在EF之外进行映射。

我使用一个大的SUPERSET Context来管理DB的创建/迁移。但不用于日常访问。

较小的DBcontexts用于每天的全部数据访问。

所以,一定要使用有界上下文。这可以针对相同的数据存储进行操作。 回答问题时,按照字面意思,“是的,同一个表格(DbSet)可以出现在许多上下文中。”


当将同一实体添加到多个上下文中,特别是当EF通过约定引入导航属性时,您如何管理实体配置?我在这里有更多关于该问题的信息:https://dev59.com/GXbZa4cB1Zd3GeqPDDM4。 - Brett Postin
1
不幸的是,如果“ignore”属性或表格不足以满足您对同一表格具有不同导航选项的特定要求,则需要一个没有导航的基类NO nav。Class1:base带有NVA,而class2没有Nav。如果您有这个特定要求,那么这一方面是痛苦的,但是不可避免的。 - phil soady

6
这种方法存在一些根本性问题(依我之见):
EF和任何ORM一样,都属于持久化关注点。因此,它不应该干扰你如何构建你的领域模型。你所有实体都存储在一个持久化存储中的事实,可能表明你的有界上下文重叠或不存在。
尝试转移到更好的结构并不是坏事 :) --- 然而,正如Mark Oreta所说,我可能不会费心去关注EF结构。
你遇到的主要问题是尝试从你的领域模型中读取。这似乎经常在系统中出现,使事情变得非常困难。延迟加载正是由于这个直接结果。当你读取时,理想情况下,你应该使用一个查询层,具有访问优化用于读取的查询存储(可能是相同的数据库)。在你的例子中,你需要在销售领域中的客户名字非规范化。这很好。试图通过读取你的领域模型,然后尝试从另一个有界上下文中的领域模型中获取数据来获得它,这就是导致你痛苦的原因。
如果你走分离数据的路线,那么你将需要保持它分离
尽管各个BC的数据都可能存储在同一个存储中,但你应该把你的数据视为每个BC都有自己的数据库。有时我有一个单一的项目,其中包含不同文件夹/命名空间(在这里是.NET)的各种关注点(层)。它应该可以随意将这些关注点分离成单独的程序集。因此,它们不应该过于紧密耦合。相同的情况也适用于你试图分割的这个数据结构。你应该本质上能够将相关的BC数据拆分到单独的数据库中。获取跨BCs的数据的机制是另一回事,如果无法解决,你可能会发现很难去做。
虽然我认为从数据方面确定BC可能不是最好的想法,但这确实是朝着正确方向迈出的一步 :)

那么你的意思是,如果我将客户添加到我的销售业务组件中,这并不重要,因为将每个业务组件视为单独的数据存储是有好处的? - Null Reference
另外,当你说我需要在我的销售领域中添加一个非规范化的客户名称时,你是指我需要在我的销售表中添加另一列CustomerName吗?还是你的意思是我需要将整个客户表添加到我的销售edmx(BC)中? - Null Reference
事情是这样的:如果您将客户添加到销售领域,则它将成为一个VO,因为它提供数据(仅视图),您根本不会与其交互。也许销售领域中的“客户”只有ID和FullName。但是不要将客户实体“拉入”销售领域。我建议在您的销售领域中选择非规范化的客户名称。当然,这一切都取决于上下文 :) - Eben Roux

2
如果你想通过导航属性(Sale.Customer)从销售实体访问客户实体,你需要将它添加到销售edmx中。
把所有表都放在一个edmx中并不一定是坏事,只要你创建它、用于你想要的操作,然后释放掉,对象图就不会变得那么大。
或者,如果你想保留有界上下文,可以有一个存储库或其他东西在需要时按ID获取它。
var customer = customerContext.GetCustomerById(sale.CustomerId);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接