EF代码优先迁移:SetInitializer和Initialize
本文关键字:SetInitializer Initialize 迁移 代码 EF | 更新日期: 2023-09-27 18:10:36
我正在进行代码优先迁移,我正在尝试使用基于代码的迁移(Automatedmigration=false)。我现在能做的就是:
-Run Enable Migrations
-Add migration Initial
-使用"Update Database"运行迁移(创建migrationhistory表)
-修改我的模型
-Execute添加迁移"changesInMyModel"
现在我想做的是能够自动运行我所有的迁移。使用如下命令:
[Test]
public void UpdateDataModel()
{
Database.SetInitializer(
new MigrateDatabaseToLatestVersion<MyContext, MyConfiguration>());
var dc = new MyContext();
dc.Database.Initialize(true);
}
执行测试并进入数据库后,我看不到我的任何更改。我能做什么?欢迎指教!
更新:我的配置类正在使用Automatedmigration=false.
MyConfiguration类是公共的,在它的父项目之外可见。
我没有在app.config中使用任何配置,因为我正在使用数据库。SetInitializer
在运行我的测试之前创建MigrationHistory
运行update database from package manager控制台迁移运行良好。
更新:我正在运行一个版本修改(使用基于代码的迁移)下面的例子:http://msdn.microsoft.com/en-us/data/jj591621.aspx,但问题仍然存在。—启用迁移-添加迁移-尝试SetInitializer和Initialize,但没有任何结果。
更新:当Automatedmigration=true时,SetInitializer和Initialize工作正常,模型中的更改与数据库同步。-使用下面的代码工作。
new DbMigrator(new Configuration()).Update(); What should be the difference?
只是根据我们在线程中的评论进行更新…
这解决了问题 -但坦率地说我仍然不确定为什么它会:)
尝试与
EnableAutomaticMigrations
打开/关闭只是为了检查。试着把尝试捕获以确保没有错误。并尝试直接运行DbMigratornew DbMigrator(new Configuration()).Update()
-
…和其他注释
迁移应该在没有该标志的情况下工作。而DbMigrator正是这样做的这个初始化器做什么。似乎没有什么区别,这是源代码(不相同的EF -但我认为它是相同的)-MigrateDatabaseToLatestVersion .
我的猜测是您应该尝试将protected void Application_Start()
下的代码放在Global.asax.cs
中。这样,您的数据库连接将总是在其他所有内容之前初始化。
if (!WebSecurity.Initialized)
WebSecurity.InitializeDatabaseConnection("DefaultConnection",
"UserProfile", "UserId", "UserName", autoCreateTables: true);
也许这个Pro Asp。Net Mvc 4将帮助您设置测试项目。也有一个MVC 3版本,但他们几乎会说同样的事情。他们建议使用Moq库,它在过去帮助了我。