无法从主应用程序执行自定义NuGet程序包的代码优先迁移

Alf*_*ñoz 5 entity-framework code-first ef-migrations

我创建了一个包含在主MVC3 Web应用程序中的模块。该模块打包成NuGet软件包,可以通过NuGet进行安装和卸载。主站点和模块都使用Code First,EF> = 4.3

要创建程序包,我有另一个MVC3站点,并且所有功能都在一个区域内,因此,要创建程序包,我只需要打包库,视图和所有需要的文件。数据库迁移在项目中工作正常,并且程序包创建良好。

现在,我通过NuGet将软件包安装在主站点中。该站点位于另一个解决方案中,该解决方案有两个项目:

  • MyProject.Web.UI:这是一个Mvc3项目
  • MyProject.EntityFramework:这是一个包含所有模型的类库,dbContext for MyProject ...

软件包已正确安装,并且Area,Area视图和库已正确安装。

现在的问题是我如何更新数据库?我首先尝试运行“ Update-Database”,但收到消息:

“在程序集'MyProject.Web.UI'中未找到迁移配置类型。(在Visual Studio中,您可以使用程序包管理器控制台中的Enable-Migrations命令来添加迁移配置)。”

然后,我尝试通过“ Enable-Migrations”启用迁移,但又收到了另一条消息:

“在程序集'MyProject.Web.UI'中找不到上下文类型。”

我也尝试仅运行该站点,看看是否自动应用了更改,但出现了带有典型消息的异常页面:

“自创建数据库以来,支持'NugetPackageDbContext'上下文的模型已更改。请考虑使用代码优先迁移来更新数据库”

我不知道要怎么做才能通过NuGet软件包中的迁移所需的更改来更新数据库。任何人都可以在这件事上说明一下吗?我对Migrations还是很陌生,如果有更改而不是在控制台中运行命令,也许有一些配置可以更新数据库,我有点迷失了。

提前致谢 :)

Alf*_*ñoz 2

好消息!看来我明白了。我正在寻找一种方法使NuGet包将数据库更新到最新版本。

好吧,这个包附带了一个管理控制器,所以我添加了一个名为“更新”的新操作:

public ActionResult Update()
    {
        System.Data.Entity.Database.SetInitializer(new System.Data.Entity.MigrateDatabaseToLatestVersion<MyPackageDbContext, MyPackage.Migrations.Configuration>());
        return View();
    }
Run Code Online (Sandbox Code Playgroud)

在我的迁移配置类中,我有:

public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }
Run Code Online (Sandbox Code Playgroud)

我不得不说,在我做这一切的过程中,我发现了一些奇怪的行为。让我惊讶的一件事是,我不知道这是否正常,请阅读以下内容:

  1. 使用新迁移安装了软件包,但数据库不是最新的。因此,如果我访问受此影响的 EF,我会得到关于此的异常。好的,到此为止。
  2. 我转到我的操作 /MyPackage/Admin/Update 并运行它。显然它运行了。我访问数据库,但没有看到任何变化。即使迁移表也没有新行。
  3. 我再次访问之前显示异常的 EF 部分(点号 1),然后一切都会完成,数据库会更新,迁移表会显示新行。

您必须注意的一件事是 Configuration 类是内部的,但因为这是一个模块,所以我需要可以从另一个程序集访问。我试图将其公开,但我收到了一些奇怪的警告/错误,我不知道它们是否相关。所以最后我把它保留在内部但使用了

[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("OtherAssembly")]
Run Code Online (Sandbox Code Playgroud)

我在 Visual Studio 中发现了一些奇怪的行为,包括 NuGet 包、CF、迁移等所有这些东西……我不知道这些东西是否是错误,但所有这些事情花了我整整两个工作日。

我希望它对任何其他想要创建可更新的 CF NuGet 包的人有用。