Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 我是否在多实体框架绑定的上下文中添加相同的表_.net_Entity Framework_Domain Driven Design_Edmx_Bounded Contexts - Fatal编程技术网

.net 我是否在多实体框架绑定的上下文中添加相同的表

.net 我是否在多实体框架绑定的上下文中添加相同的表,.net,entity-framework,domain-driven-design,edmx,bounded-contexts,.net,Entity Framework,Domain Driven Design,Edmx,Bounded Contexts,我有一个相当大的数据库,大约80个表。因此,我决定将这些表分离到有界上下文中,而不是将所有80个表都放在一个大edmx文件中 所以我有有限的上下文,比如销售、客户等 我的客户edmx文件中有我的主客户表。但是,我还需要从Sales edmx上下文的customer表中访问某些字段,而不是全部,而是1或2个字段(例如,我只需要customer name,而不是整个customer对象/表) 是否必须将整个customer表添加到Sales edmx文件中?此场景的最佳实践是什么?如果您希望能够使用

我有一个相当大的数据库,大约80个表。因此,我决定将这些表分离到有界上下文中,而不是将所有80个表都放在一个大edmx文件中

所以我有有限的上下文,比如销售、客户等

我的客户edmx文件中有我的主客户表。但是,我还需要从Sales edmx上下文的customer表中访问某些字段,而不是全部,而是1或2个字段(例如,我只需要customer name,而不是整个customer对象/表)


是否必须将整个customer表添加到Sales edmx文件中?此场景的最佳实践是什么?

如果您希望能够使用导航属性从销售实体访问客户实体(
Sale.Customer
),则需要将其添加到销售edmx中

将所有表放在一个edmx中并不一定是件坏事,只要创建它,将其用于所需的操作,然后将其丢弃,对象图就不会变得那么大

或者,如果您想保留有界上下文,可以在需要时使用存储库或其他东西通过ID获取它

var customer = customerContext.GetCustomerById(sale.CustomerId);

这种方法有两个基本问题(IMO):

EF和任何ORM一样,属于持久性问题。因此,它不应该干扰您如何构造域模型。将所有实体持久化到听起来像一个持久化存储中的事实可能表明您的有界上下文重叠或不存在

尝试转移到一个更好的结构并不是一件坏事:)---然而,正如马克·奥雷塔所说,我可能不会为EF结构而烦恼

您遇到的主要问题是由于试图从域模型中读取导致的。这似乎在系统中经常出现,使事情变得相当困难。延迟加载正是这一点的直接结果。在阅读时,理想情况下,您应该使用一个查询层,该层可以访问为阅读而优化的查询存储(可能是同一个数据库)。在您的示例中,您的销售域中需要一个非规范化的客户名称。那很好。试图通过读取您的域模型,然后尝试从另一个有界上下文中的域模型中拉入数据来实现这一点,正是造成这种痛苦的原因

如果您继续分割数据,那么您需要保持数据的分割

尽管来自不同BC的数据可能都在同一个存储中,但您应该将您的数据视为每个BC都有自己的数据库。有时,我在不同的文件夹/名称空间(.NET here)中有一个具有不同关注点(某些层)的单个项目。应该可以一时兴起,将这些关注点拆分成单独的组件。因此,它们不应该紧密耦合。您尝试拆分的数据结构也是如此。实际上,您应该能够将相关的BC数据拆分到单独的数据库中。通过BCs获取数据的机制是另一个问题,我想如果不能解决这个问题,您可能会发现这很困难


虽然我不认为从数据方面识别BC是最好的主意,但这肯定是朝着正确方向迈出的一步:)

我喜欢朱莉·勒曼对这个话题的看法

我使用有界上下文来提高访问性能,因为使用较小的DBContext时,即使使用生成的视图,上下文的加载时间也会更快。简化访问模型是一个不错的选择。 关于EF站点的性能考虑:

BCs还允许其他好处,如限制访问以匹配业务问题。 如果您尝试使用的数据库上下文不仅不同于DBSet出现的位置,而且还不同于您尝试更改模型视图的位置,则会出现更大的问题。我认为最好在EF和mapped之外进行

我使用一个大型超集上下文来管理数据库的创建/迁移。但不是日常访问

较小的数据库上下文用于每天全天访问数据

所以是的,一定要使用有界上下文。这可能与相同的数据存储相冲突。
并在同一个表(DbSet)中回答“是”的问题可以出现在许多上下文中。

因此,您的意思是,如果我将客户添加到我的销售业务连续性中并不重要,因为最好将每个业务连续性视为单独的数据存储区。此外,当您说我需要在我的销售域中使用非规范化的客户名称时,您的意思是我需要在我的销售表中添加另一列CustomerName?还是您的意思是我需要要将整个customer表添加到my sales edmx(BC)?问题是:如果您将customer添加到您的sales domain,它将成为一个VO,因为它提供数据(只是一个视图),您根本不会与它交互。也许sales domain中的
customer
只有一个ID和全名。但不要“拉”“在客户实体中输入到您的销售域中。我会选择在您的销售域中使用非规范化的客户名称。当然,这一切都取决于上下文:)当将同一个实体添加到多个上下文中时,尤其是当EF通过约定拉入导航属性时,如何管理实体配置?我有更多关于这个问题的信息。不幸的是,如果
ignore
属性或表不够,并且您希望在同一个表上有不同的导航选项,那么您将需要一个基类NO-nav。类别1:添加NVA的基础和不带导航的类别2。这方面是痛苦的,但如果你有特定的要求,那是不可避免的。