实体框架6.0.2。 .Net 4.我试图从代码更新SQL Server CE 4.0数据库,因此当发布新版本的应用程序时,数据库会自动升级。
项目中有两个数据上下文,它们针对两个不同的数据库。这是我正在做的更新其中一个:
Private Sub UpdateDatabase(connectionString As String)
Dim config As DbMigrationsConfiguration(Of MainDBContext) = New DbMigrationsConfiguration(Of MainDBContext)()
config.TargetDatabase = New System.Data.Entity.Infrastructure.DbConnectionInfo(connectionString, "System.Data.SqlServerCe.4.0")
config.ContextKey = "MyProject.MainDBContext"
Dim migrator As DbMigrator = New DbMigrator(config)
migrator.Update()
End Sub
来自Update方法的消息是存在挂起的更改,因此我必须运行Add-Migration或启用自动迁移。但是,已运行添加迁移,当我允许自动迁移时,Update会尝试创建已在数据库中的表。
运行Update-Database在这样调用时工作正常:
Update-Database -configuration MyProject.MigrationsMainDb.Configuration -Verbose
我检查过UpdateDatabase函数中使用的连接字符串与配置文件中的连接字符串相同(由Update-Database使用)。我也尝试过不设置ContextKey属性,但没有区别。
有什么明显的我做错了吗?为什么迁移器认为有待处理的更新,但Update-Database很好......?
答案 0 :(得分:0)
我让它发挥作用。我意识到,而不是创建"泛型"配置类我应该创建通过Enable-Migrations命令添加到项目中的配置类。因此代码已更改为以下内容:
Private Sub UpdateDatabase(connectionString As String)
Dim config As MigrationsMainDb.Configuration = New MigrationsMainDb.Configuration()
config.TargetDatabase = New System.Data.Entity.Infrastructure.DbConnectionInfo(connectionString, "System.Data.SqlServerCe.4.0")
Dim migrator As DbMigrator = New DbMigrator(config)
migrator.Update()
End Sub
此更改导致配置对象正确设置了属性。例如,MigrationsDirectory属性,之前没有设置它应该是什么。这可能是问题的原因 - 迁移者没有找到迁移(在错误的目录中查找它们)并假设必须将整个模型应用于数据库。
进行此更改后,我仍然有一个小故障,有待更改。在Visual Studio中,文件看起来像修改过,在类中有一个额外的(测试)属性,但当我尝试删除额外的行时,我收到了来自VS的消息,如#34;在master"上编辑,或者某事像那样。我关闭了文件并重新打开 - 额外的属性消失了。我想这是git的东西,检查分支和VS没有正确刷新文件?真的不确定。但是一旦这条线不再存在并且修改后的代码就位,Update函数就开始正常工作了。
立即更新更新现有数据库并成功创建新数据库。太棒了:))