了解实体框架启用迁移和上下文

Posted

技术标签:

【中文标题】了解实体框架启用迁移和上下文【英文标题】:Understanding Entity Framework Enable Migrations and Contexts 【发布时间】:2012-12-24 01:05:08 【问题描述】:

我使用 issues 的模型与 Entity Framework 认为的当前版本不同步,因此我清除了所有迁移并按照 this post 重新开始。

重置后。我去启用实体框架,它给出了这个错误。

在程序集“Proj”中发现了多个上下文类型。到 为 Proj.Models.UsersContext 启用迁移,使用 启用迁移-ContextTypeName Proj.Models.UsersContext。到 为 Proj.Models.InjuriesContext 启用迁移,使用 启用迁移-ContextTypeName PamperWeb.Models.InjuriesContext。 ...对于我所有的上下文

我能够启用第一个上下文用户,但是当我尝试启用另一个上下文时,我收到一个错误提示

已在项目“Proj”中启用迁移。到 覆盖现有的迁移配置,使用 -Force 参数。

显然,我对 MVC 和实体框架的工作方式还有很长的路要走。我在每个模型类中都设置了上下文。我应该只有一个上下文和那个上下文中的所有数据库集吗?如果是这样,这个上下文与哪个模型类文件有关吗?我当前的所有上下文都指向同一个数据库。

【问题讨论】:

为什么会有多个上下文类?我以前没见过这样做的。 @kristen g 我认为每个模型类都必须有一个上下文。没有意识到它们应该只是一个上下文。 感谢您发布这篇文章——当我看到基本 MVC 应用程序中提供的模型时,我做了同样的假设,它有“UserProfile”和“UsersContext”类(加载 UserProfiles)——我只是认为每个实体类型都应该有自己的上下文,这就是它应该的样子。我把头发拉出来了! 【参考方案1】:

在正常的应用程序中,您应该为所有模型类提供带有数据库集的单一上下文。上下文类应该在它自己的文件中。上下文构成了您的整个模型,并让您可以访问数据库。它提供了许多开箱即用的功能,但该功能仅适用于在您的上下文中注册的模型类。如果将模型类划分为单独的上下文,则在处理从不同上下文加载的实体时会失去一些开箱即用的功能。

【讨论】:

以上是关于了解实体框架启用迁移和上下文的主要内容,如果未能解决你的问题,请参考以下文章

无法在类库中为实体框架启用迁移

多个上下文的实体框架迁移脚本故障转移现有的 __MigrationHistory 表

实体框架数据库错误

如何为多个数据库启用迁移,但只有一个上下文?

实体框架 enable-migrations 在程序集中找不到上下文类型

使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段