DDD和EF代码优先迁移

时间:2015-12-12 20:37:13

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

我最近在Steve Smith和Julie Lerman看过Pluralsight上的Domain-Driven Design Fundamentals,这是一个很棒的课程,但是我有一个关于EF Code-First和DDD的问题,我得到了丰富的实体和实际上了解大多数DDD,但我很难理解在DDD中使用EF Code-First。假设我有两个有界的上下文,并且我在每个有界上下文中都有一个Customer实体,共享一个Id和Name。

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,它使用自己的有界上下文客户实体,如上所定义)< / p>

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

2 个答案:

答案 0 :(得分:2)

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

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

Database.SetInitializer<DelivieriesContext>(null);

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

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

答案 1 :(得分:1)

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

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