【问题标题】:How to use entity framework migrations with multiple dbcontexts mapping different domain classes to the same table如何使用具有多个 dbcontexts 的实体框架迁移将不同的域类映射到同一个表
【发布时间】:2018-11-07 17:56:55
【问题描述】:

我想使用 DDD 方法来创建我的域模型。我明白,在有界上下文中,只有该上下文所需的数据才应该可用,并使用该上下文的普遍语言。

假设我在命名空间BuyerContext 中有一个Buyer 类,在命名空间SellerContext 中有一个Seller 类。最后,两个域类都应该映射到数据库的Users 表。 我为此使用 EF Core 2.1。

一个域类可能具有不属于另一个域类的字段/属性,例如Buyer.CreditCardNumberSeller.Rating

为了利用 DDD 方法,我为每个有界上下文创建了两个 dbcontext,例如 BuyerDbContextSellerDbContext,并将 EF 配置为使用相同的 Users 表,但仅映射有界上下文所需的那些字段。我知道该怎么做,我还阅读了有关为每个 dbcontext 创建一个项目的信息。

我不知道的是,我需要做什么,才能在这个设置中使用迁移,所以当数据库将被初始化或迁移时,它会创建一个 User 带有字段 @ 的表987654332@(在BuyerDbContext中配置)和一个字段Rating(在SellerDbContext中配置)。

我找到的唯一解决方案是创建另一个模型,该模型代表具有自己的 dbcontext(如 EntitiesDbContext)的完整数据库,并使用该上下文进行迁移。所以我最终得到了一个类User,其中有两个字段CreditCardNumberRating。我读到我可能需要在其他 dbcontexts 上禁用某种“初始化”。

这是正确的方法吗?

【问题讨论】:

  • 您应该问自己的第一件事是:买家和卖家真的是不同的有界上下文吗?通常我会说,因为它们通常属于一起。有界上下文通常类似于“销售”或“营销”、“物流”。在不了解很多上下文和领域的情况下,人们很难给你任何答案。买方和卖方听起来就像您域中的实体或聚合,而不需要有界上下文
  • 补充@Tseng 的评论,如果买家和卖家实际上处于不同的有界上下文中,那么它们应该存储在不同的数据库(或模式,或至少表)中。有界上下文之间应该有最小的耦合,并且共享一个表完全违背了在 BC 中拆分域的目的。另一方面,正如 Tseng 所提到的,买家和卖家不太可能属于不同的 BC,因为它们在许多情况下都是必要的:买家从卖家那里购买商品,卖家将商品交付给买家,卖家将促销活动发送给买家等

标签: entity-framework domain-driven-design


【解决方案1】:

我找到的唯一解决方案是创建另一个代表完整数据库的模型

这是正确的方法吗?

是的。就是这样,或者根本不使用迁移并使用其他工具管理数据库架构。

【讨论】:

    【解决方案2】:

    就我个人而言,我不喜欢迁移,因为我认为满足数据库的需求不是应用程序的责任。如果可能的话,我主要将 SSDT 用于数据库解决方案,但这当然取决于您的项目是否可以部署 SSDT 包,但通常情况下是这样。

    https://visualstudio.microsoft.com/vs/features/ssdt/

    【讨论】:

    • 是的,我可能不会在生产中使用迁移,但它是一个很好的开发工具。谢谢ssdt的提示,我试试看
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 2015-08-17
    • 1970-01-01
    • 2019-02-04
    相关资源
    最近更新 更多