EF Code First Migrations:SetInitializer和Initialize

时间:2013-04-22 20:18:29

标签: c# .net entity-framework code-first

我正在开发Code First Migration,我正在尝试使用基于代码的迁移(Automatedmigration = false)。我现在可以做的是:

- 运行启用迁移

- 添加迁移初始

- 使用“更新数据库”运行迁移(创建迁移历史表)

- 对我的模型进行更改

-Execute添加迁移“changesInMyModel”

现在我要做的是能够自动运行我的所有迁移。 使用类似的东西:

[Test] 
public void UpdateDataModel()
{
 Database.SetInitializer(
 new MigrateDatabaseToLatestVersion<MyContext, MyConfiguration>());
 var dc = new MyContext();
 dc.Database.Initialize(true);
}

执行测试并转到数据库后,我看不到任何更改。 我能做什么?欢迎提出建议!

更新: Myconfiguration类使用Automatedmigration = false。

MyConfiguration类是公共的,在其父项目之外可见。

我没有在app.config中使用任何配置,因为我使用的是源代码中的Database.SetInitializer。

在运行我的测试之前,创建了MigrationHistory

从包管理器控制台运行更新数据库,迁移运行正常。

更新: 我正在运行以下示例的修改版本(使用基于代码的迁移): http://msdn.microsoft.com/en-us/data/jj591621.aspx,但问题仍然存在。 - 启用迁移 - 添加迁移 - 尝试SetInitializer和Initialize但没有任何反应。

更新: - 当Automatedmigration = true时,SetInitializer和Initialize正常工作,模型中的更改与db同步。 - 使用下面的代码工作。

new DbMigrator(new Configuration()).Update(); What should be the difference?

2 个答案:

答案 0 :(得分:1)

只是根据我们在帖子中的评论进行更新......

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

  

尝试使用 EnableAutomaticMigrations 打开/关闭以进行检查。试试看   try-catch确保没有错误。并尝试直接运行DbMigrator    new DbMigrator(new Configuration()).Update() -

......以及其他评论

  

迁移应该工作w或o那个标志。并且DbMigrator完全正确   初始化程序的作用。似乎没有区别 - 这是   源代码(不同于EF版本 - 但我认为它是相同的) -   MigrateDatabaseToLatestVersion

答案 1 :(得分:0)

我猜您应该尝试将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 version,但他们几乎会说同样的话。他们建议使用Moq Library,过去它帮助了我。