我创建了一个模块,将包含在主MVC3 web应用程序中。该模块被打包到NuGet软件包中,可以通过NuGet进行安装和卸载。主站点和模块都使用Code First,EF>=4.3
为了创建包,我有另一个MVC3站点,所有功能都在一个区域内,所以为了创建包我只打包了库、视图和所有需要的文件。数据库迁移在项目中运行良好,包也创建得很好。
现在我通过NuGet在主站点中安装该软件包。这个网站在另一个解决方案中,该解决方案有两个项目:
- MyProject.Web.UI:这是一个Mvc3项目
- MyProject.EntityFramework:这是一个包含所有模型的类库,用于MyProject的dbContext
软件包已正确安装,Area、Area视图和库也已正确安装。
现在的问题是如何更新数据库?我首先尝试运行"更新数据库",但我得到了消息:
"在程序集中找不到迁移配置类型"MyProject.Web.UI"。(在Visual Studio中,您可以使用从Package Manager控制台启用迁移命令以添加迁移配置)。">
我试着用"启用迁移"来启用迁移,但我得到了另一条消息:
"在程序集'MyProject.Web.UI'中找不到上下文类型。">
我也尝试过运行网站,看看更改是否自动应用,但我得到了带有典型消息的异常页面:
"支持'NugetPackageDbContext'上下文的模型已更改自数据库创建以来。考虑使用代码优先迁移更新数据库">
我不知道该怎么做才能用NuGet包中所需的迁移更改来更新数据库。有人能在这件事上澄清一下吗?我对迁移很陌生,也许有一些配置可以更新数据库,如果有更改,而不是在控制台中运行命令,我有点不知所措。
提前感谢:)
好消息!我似乎明白了。我在寻找一种方法来制作NuGet包,将数据库更新到最新版本。
这个软件包附带了一个Admin控制器,所以我添加了一个名为Update:的新操作
public ActionResult Update()
{
System.Data.Entity.Database.SetInitializer(new System.Data.Entity.MigrateDatabaseToLatestVersion<MyPackageDbContext, MyPackage.Migrations.Configuration>());
return View();
}
在我的迁移配置类中,我有:
public Configuration()
{
AutomaticMigrationsEnabled = true;
}
我不得不说,在我做这一切的过程中,我发现了一些奇怪的行为。有一件事让我惊讶,我不知道这是否正常,阅读安全:
- 安装了带有新迁移的程序包,但数据库不是最新的。因此,如果我访问EF,受此影响,我会得到关于此的异常。好的,到此为止
- 我转到我的操作/MyPackage/Admin/Update并运行它。显然它正在运行。我转到数据库,没有看到任何更改。即使迁移表也没有新行
- 我再次访问之前显示异常的EF部分(点编号1),然后一切都通过了,数据库更新了,迁移表显示了新行
您必须注意的一件事是Configuration类是内部的,但因为这是一个模块,所以我需要从另一个程序集访问。我试图公开它,但我收到了一些奇怪的警告/错误,我不知道它们是否相关。所以最后我把它放在内部,但使用了
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("OtherAssembly")]
我在Visual Studio中发现了一些奇怪的行为,包括NuGet包、CF、迁移。。。我不知道这些东西是不是bug,但这一切花了我整整两个工作日的时间。
我希望它对任何其他想要创建可更新的CF-NuGet包的人都有用。
在包管理器控制台中,您需要将默认项目设置为MyProject.EntityFramework
您可能还需要确保MyProject.Web.UI
被设置为启动项目(如果有多个),然后您可以将连接字符串传递到更新命令中:
Update-Database -ConnectionStringName MyConnStringName
这应该会正确更新数据库,除非有数据会丢失。
如果您的DbContext
位于MyProject.EntityFramework
中,则需要将Package Manager控制台中的默认项目设置为MyProject.EntityFramework
,然后才能使用Update-Database
。
我意识到这个问题已经很老了,但由于我看不到这个答案,我无论如何都会把它扔进去。
要在项目或外部引用上执行迁移等操作,您仍然可以使用相同的三个命令:
Enable-Migrations
Add-Migration
Update-Database
但是您需要提供一些额外的参数。对于EnableMigrations命令,您需要添加-ContextTypeName和-ContextAssemblyName命令(可选),如:
Enable-Migrations -ContextTypeName MyProject.EntityFramework.NugetPackageDbContext -ContextAssemblyName MyProject
这将在当前项目中为您提供一个迁移配置类。另外两个命令将要求您指定这个配置类:
Update-Database -ConfigurationTypeName MyProject.Web.UI.Migrations.Configuration
希望能帮助