为了使用Entity Framework实现领域驱动设计,我采用了Julie Lerman在TechEd North America 2013(http://channel9.msdn.com/Events/TechEd/NorthAmerica/2013/DEV-B336#fbid=4tnuPF6L-Jc)上介绍的方法。这种方法将EF实体类用作领域类。对于不同的有界上下文,领域实体类具有不同的属性,甚至可能有不同的名称,尽管它们在同一个表中存储数据。例如,“客户服务”有界上下文中的客户实际上是一个“客户”,但在“航运”有界上下文中,他是一个“收件人”,只有一部分客户属性。为每个有界上下文存在一个不同的EF上下文,该上下文仅包括有界上下文需要的实体的DbSet。通过覆盖OnModelCreating,我们甚至可以排除与有界上下文无关的引用实体。使用POCOs实现这一部分相当容易。
问题出在使用Code First创建数据库时。如果我们让Code First为每个不同的EF上下文创建数据库,那么我们最终会得到几个数据库。如果我们在EF上下文的构造函数中定义数据库名称,则数据库将与第一个使用的EF上下文一起创建,并且当使用第二个EF上下文时,我们会收到InvalidOperationException(指模型已更改)(缺少实体,缺少属性等)。如果我们使用迁移来更新数据库,可能会出现与迁移的正常使用混淆并导致无法正常工作的情况。
作为暂时解决方案,我使用单独的EF上下文仅用于数据库创建。这意味着我必须再次实现所有EF实体,只是为了这个目的。另一个问题是,我必须在应用程序启动时创建此EF上下文的实例,以确保数据库得到创建并(如有必要)迁移。
我相信还有其他解决方案。所以,请告诉我们如何解决这个问题。
问题出在使用Code First创建数据库时。如果我们让Code First为每个不同的EF上下文创建数据库,那么我们最终会得到几个数据库。如果我们在EF上下文的构造函数中定义数据库名称,则数据库将与第一个使用的EF上下文一起创建,并且当使用第二个EF上下文时,我们会收到InvalidOperationException(指模型已更改)(缺少实体,缺少属性等)。如果我们使用迁移来更新数据库,可能会出现与迁移的正常使用混淆并导致无法正常工作的情况。
作为暂时解决方案,我使用单独的EF上下文仅用于数据库创建。这意味着我必须再次实现所有EF实体,只是为了这个目的。另一个问题是,我必须在应用程序启动时创建此EF上下文的实例,以确保数据库得到创建并(如有必要)迁移。
我相信还有其他解决方案。所以,请告诉我们如何解决这个问题。