实体框架核心:创建一个合并多个DbContext的迁移(具有多个迁移)

时间:2019-05-15 13:41:53

标签: c# entity-framework-core identityserver4 entity-framework-core-migrations entity-framework-core-2.2

当我开始一个项目(Identity Server 4服务器)时,我创建了一个ApplicationDBContext(它继承自ASP.NET IdentityContext并具有一些自定义表),并使用了ConfigurationDBContext以及Identity Server 4中的PersistedGrantDBContext。我创建了3个迁移(每个DBContext一个)。尽管数据在同一个数据库中(所以是一个数据库)。

现在,我重构了代码,为我提供了一个新的DBContext,它在一个DBContext中具有所有3个数据库。

我的问题是新的迁移。

到目前为止,我删除了旧的DBContexts并创建了一个迁移,当我对一个空数据库运行它时,它会再次创建完全相同的数据库。

但是在迁移现有数据库(包含现有数据)时,会引发表X已经存在的异常。

我认为这是因为我删除了旧代码和旧迁移。

因此,如何创建将3个不同的DBContext合并到一个新的DBContext中的迁移。

我假设是否保留旧代码并使用旧迁移,它也会尝试多次创建表(因为它们在旧的拆分迁移和新的组合迁移中)?

如果表存在(是否具有相同的布局,并采用表原样),有没有办法告诉新迁移不抛出错误?

1 个答案:

答案 0 :(得分:0)

我认为您必须保留3个默认(旧)上下文。

因为: 将3合1合并并退出其默认上下文是非常不好的做法。

    所有这3个上下文都有其API与数据一起使用,哪些API将确保所有数据都得到良好维护,哪些API将使Code-First是真正的代码优先,但不是Code-Once。
  1. 如果将它们合并为一个,如何使这些项目的数据库和API保持最新?以及如何实现这些API,您想再次编写它们?
  2. Code-First主要用于数据库更改,如果您需要自定义它们,只需在它们自己的上下文中自定义它们即可。那么您可以使用自己的上下文将它们组合为一个,但是不幸的是,您必须仔细维护您的迁移代码以确保彼此之间没有冲突。
  3. 我建议您将IdentityContext用作新上下文的基础,不要将其他2个合并到此处。您可以保留3个上下文。