【问题标题】:DDD and EF Code-First MigrationsDDD 和 EF 代码优先迁移
【发布时间】:2016-03-18 14:47:39
【问题描述】:

我最近在 Pluralsight 上观看了 Steve Smith 和 Julie Lerman 的 Domain-Driven Design Fundamentals,这是一门很棒的课程,但是我是否有关于 EF Code-First 和 DDD 的问题,我得到了丰富实体的概念并真正理解了大多数 DDD,但我很难理解 EF Code-First 在 DDD 中的使用。假设我有两个有界上下文,并且在每个有界上下文中都有一个客户实体,共享一个 ID 和名称。

namespace Accounts
{
    public class Customer : Entity
    {
        public Guid Id { get; private set; }
        public string Name { get; private set; }
        public string AccountNo { get; private set; }
    }
}

namespace Deliveries
{
    public class Customer : Entity
    {
        public Guid Id { get; private set; }
        public string Name { get; private set; }
        public Address DeliveryAddress { get; private set; }
    }
}

在每个有界上下文中,我都有一个带有 DbContext 的数据层,为了参数,让我们调用一个 Accounts.AccountsDbContext 和 Deliveries.DeliveriesDbContext(每个都有一个 IDbSet,它使用上面定义的自己的有界上下文客户实体)

我的问题和我正在努力理解的是如何处理跨不同 DbContext 的代码优先迁移。 Customer 实体引用同一个数据库表,但只公开与它们所在的有界上下文相关的属性。那么 EF 如何通过迁移来处理这个问题?

【问题讨论】:

    标签: entity-framework ef-code-first domain-driven-design


    【解决方案1】:

    当您使用多个上下文共享表时,您不能使用自动迁移(我从不使用它们)。您可以生成所有迁移并在单个上下文中实施(这是一项手动任务,但并不难)。

    另外,我认为在某些情况下,您可以评估存储库模式(使用多个存储库和单个上下文)。

    【讨论】:

      【解决方案2】:

      您需要一个定义客户所有字段的上下文。此上下文将处理迁移。如果需要,您可以从有界上下文中隐藏此上下文。您必须使用

      禁用有界上下文的迁移
      Database.SetInitializer<AccountsContext>(null);
      

      Database.SetInitializer<DelivieriesContext>(null);
      

      这些信息必须出现在 Julie 的课程中​​,你可能错过了。

      她的课程有一个很好的总结。你会发现它在 this MSDN magazine article

      【讨论】:

      • 感谢您的回答,我当然不记得在课程视频中看到过它,但是我确实在代码示例中错过了这一点。它看起来像朱莉,你的回答是建议使用包含数据库所有内容的“超级”上下文并使用手动迁移,这很好,因为我从不使用自动迁移,但是,也许这只是我,但似乎有点矫枉过正拥有这个神话般的“第三”上下文能够实现代码优先,但如果这是唯一的选择,那么我想这是有道理的。
      • 是的,úber context 是唯一的方法,我自己不是特别喜欢它。
      猜你喜欢
      • 2016-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多