为了使用实体框架实现域驱动设计,我使用了 Julie Lerman 在 TechEd North America 2013 上提出的方法(http://channel9.msdn.com/Events/TechEd/NorthAmerica/2013/DEV-B336#fbid=4tnuPF6L-Jc)。此方法使用 EF 实体类作为域类。对于不同的有界上下文,域实体类具有不同的属性,甚至可能有不同的名称,尽管它们将数据存储在同一个表中。示例是“客户服务”有界上下文中的客户实际上是“客户”,但在“运输”有界上下文中,他是仅具有客户属性子集的“收件人”。对于每个有界上下文,存在一个不同的 EF 上下文,其中仅包含有界上下文所需实体的 DbSet。通过重写 OnModelCreating,我们甚至可以排除与有界上下文无关的引用实体。这部分使用 POCO 很容易实现。
问题是使用 Code First 时的数据库创建。如果我们让 Code First 为每个不同的 EF 上下文创建数据库,我们最终会得到多个数据库。如果我们在 EF 上下文的构造函数中定义数据库名称,则使用第一个使用的 EF 上下文创建数据库,并且在使用第二个 EF 上下文(缺少实体、缺少属性等)时,我们会收到 InvalidOperationException(表示模型已更改)。如果使用的 EF 上下文使用之前没有的其他 EF 上下文的实体/成员,我们可能可以使用迁移来更新数据库。但这肯定会与迁移的正常使用混淆,并且无法正常工作。作为临时解决方案,我仅将单独的 EF 上下文用于数据库创建。这意味着我必须为此再次实现所有 EF 实体。
我确信还有其他解决方案。所以,请(朱莉)告诉我们怎么做。