好的,我已经为此苦苦挣扎了一天,这是寻求答案的人的解决方案...
我假设大多数阅读这篇文章的人都在这里,因为他们有一个带有很多 DbSet<> 属性的大型 DbContext 类,并且需要很长时间才能加载。您可能会想,哎呀,这很有意义,我应该拆分上下文,因为我不会一次使用所有 dbset,我只会根据需要的情况加载“部分”上下文它。因此,您将它们分开,却发现 Code First 迁移不支持您的革命性思维方式。
因此,您的第一步一定是拆分上下文,然后为每个新上下文添加了 MigrationConfiguration 类,添加了与新 Context 类命名完全相同的连接字符串。
然后,您尝试通过执行 Add-Migration Context1 然后执行 Update-Database -Verbose 来逐一运行新拆分的上下文...
一切似乎都运行良好,但随后您注意到每次后续迁移都删除了上一次迁移中的所有表,并且只留下了最后一次迁移中的表。
这是因为,当前的迁移模型要求每个数据库有一个 DbContext,并且它必须是镜像匹配。
我也尝试过,并且有人在这里建议这样做,是创建一个 SuperContext,其中包含所有 Db 集。创建一个单一的迁移配置类并在其中运行。保留部分上下文类,并尝试实例化并使用它们。EF 抱怨 Backing 模型发生了变化。同样,这是因为 EF 将您的部分 dbcontext 与您的 Super Context 迁移留下的 All-Sets 上下文签名进行比较。
这是我认为的一个重大缺陷。
就我而言,我认为性能比迁移更重要。所以,我最终做的是,在我在 Super 上下文中运行并准备好所有表之后,我进入数据库并手动删除了 _MigrationHistory 表。
现在,我可以在没有 EF 抱怨的情况下实例化和使用我的部分上下文。它没有找到 MigrationHistory 表,只是继续前进,使我能够获得数据库的“部分”视图。
当然,权衡是对模型的任何更改都必须手动传播到数据库,所以要小心。
不过它对我有用。