繁体   English   中英

EF6 + SQL Server CE +两个上下文+从代码进行CodeFirst迁移-在添加迁移后检测未决更改

[英]EF6 + SQL Server CE + two contexts+ CodeFirst Migrations from code - Detect Pending Changes after Add-Migration

实体框架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很好...?

我成功了 我意识到,与其创建“通用”配置类,不如创建由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的消息,例如“在master上编辑”或类似的消息。 我关闭了文件并重新打开-多余的属性消失了。 我想这与git有关,检查分支和VS无法正确刷新文件吗? 不太确定。 但是一旦该行不再存在并且修改的代码就位,Update函数便开始正常工作。

现在,更新将更新现有数据库并成功创建新数据库。 太好了:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM