0

我正在研究代码优先迁移,我正在尝试使用基于代码的迁移(Automatedmigration=false)。我现在能做的是:

-运行启用迁移

-添加迁移初始

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

- 更改我的模型

- 执行添加迁移“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 工作正常,模型中的更改与数据库同步。- 使用下面的代码有效。

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

2 回答 2

1

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

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

尝试EnableAutomaticMigrations开/关只是为了检查。尝试放置 try-catch 以确保没有错误。并尝试直接运行 DbMigrator new DbMigrator(new Configuration()).Update()

...以及其他评论

迁移应该使用或不使用该标志。而 DbMigrator 正是该初始化程序所做的。似乎没有区别 - 这是源代码(不是相同的 EF 版本 - 但我认为它是相同的) - MigrateDatabaseToLatestVersion

于 2013-05-09T17:16:54.217 回答
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 版本,但他们几乎会说同样的话。他们建议使用Moq Library,它过去对我有帮助。

于 2013-04-23T01:44:46.050 回答