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?

EF代码优先迁移:SetInitializer和Initialize

只是根据我们在线程中的评论进行更新…

这解决了问题 -但坦率地说我仍然不确定为什么它会:)

尝试与 EnableAutomaticMigrations 打开/关闭只是为了检查。试着把尝试捕获以确保没有错误。并尝试直接运行DbMigrator new 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库,它在过去帮助了我。