6

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

要创建包,我有另一个 MVC3 站点,所有功能都在一个区域内,所以要创建包,我只需打包库、视图和所有需要的文件。数据库迁移在项目中运行良好,并且包创建得很好。

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

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

包已正确安装,并且区域、区域视图和库已正确安装。

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

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

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

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

我还尝试运行该站点并查看是否自动应用更改,但我得到带有典型消息的异常页面:

“支持 'NugetPackageDbContext' 上下文的模型在创建数据库后发生了变化。考虑使用 Code First 迁移来更新数据库”

我不知道如何使用 NuGet 包中的迁移所需的更改来更新数据库。任何人都可以在这件事上有所启发吗?我对迁移很陌生,如果有更改而不是在控制台中运行命令,也许有一些配置可以更新数据库,我有点迷茫。

提前致谢 :)

4

4 回答 4

2

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

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

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

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

public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }

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

  1. 安装了新迁移的软件包,但数据库不是最新的。因此,如果我访问受此影响的 EF,我会得到关于此的异常。到此为止。
  2. 我去我的行动 /MyPackage/Admin/Update 并运行它。显然它运行。我去数据库,我没有看到变化。甚至迁移表也没有新行。
  3. 我再次访问之前显示异常的 EF 部分(第 1 点),然后一切正常,数据库更新,迁移表显示新行。

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

[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("OtherAssembly")]

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

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

于 2012-09-28T13:28:14.710 回答
1

在包管理器控制台中,您将需要默认项目MyProject.EntityFramework

您可能还需要确保MyProject.Web.UI设置为启动项目(如果有多个),然后您可以将连接字符串传递给更新命令:

Update-Database -ConnectionStringName MyConnStringName

这应该会正确更新数据库,除非有数据会丢失。

于 2012-09-27T16:11:24.207 回答
0

如果您DbContext在其中,MyProject.EntityFramework则需要将包管理器控制台中的默认项目设置为,MyProject.EntityFramework然后才能使用Update-Database.

于 2012-09-27T16:03:23.210 回答
0

我意识到这个问题已经很老了,但是由于我没有看到这个答案,所以无论如何我都会把它扔掉。

要对项目或外部引用执行迁移等,您仍然可以使用相同的三个命令:

Enable-Migrations
Add-Migration
Update-Database

但您需要提供一些额外的参数。对于 Enable-Migrations 命令,您需要添加 -ContextTypeName 和可选的 -ContextAssemblyName 命令,如下所示:

Enable-Migrations -ContextTypeName MyProject.EntityFramework.NugetPackageDbContext -ContextAssemblyName MyProject

这将为您提供当前项目中的迁移配置类。其他两个命令将要求您指定此配置类:

Update-Database -ConfigurationTypeName MyProject.Web.UI.Migrations.Configuration

希望有帮助

于 2015-06-13T13:57:04.330 回答