我正在寻找一种解决方案来重命名表的列,使用 Jet Engine 数据库提供程序(MS Access 数据库)使用实体框架代码首先迁移保留值。
由于处理 Jet Engine 和 MS Access DB,我尝试了几种方法,但它们都没有奏效。
以下是我已经尝试过的模型更改和方法的详细信息:
模型变化
(我缩短了更改以保持清晰):
' OLD properties
' Public Property WebServiceState As ServiceStateType?
' Public Property WebServiceRegistrationDate As DateTime?
' Public Property WebServiceEndOfTrialDate As DateTime?
' Public Property WebServiceExpirationDate As DateTime?
' NEW
Public Property WebServiceState As ServiceState
除了“WebService”之外,还有其他服务类型都具有相同的属性(注册日期,...)。因此,我创建了一个ServiceState
代表这些属性的新类。
Public Class ServiceState
Public Property State As ServiceStateType?
Public Property RegistrationDate As DateTime?
Public Property EndOfTrialDate As DateTime?
Public Property ServiceStopAtDate As DateTime?
End Class
移民
在迁移时,我必须将数据移动到新结构。我使用 PM-Console 和“add-migration”创建了一个迁移。这是 up 函数的自动生成代码:
Public Overrides Sub Up()
AddColumn("dbo.Services", "WebServiceState_State", Function(c) c.Int())
AddColumn("dbo.Services", "WebServiceState_RegistrationDate", Function(c) c.DateTime())
AddColumn("dbo.Services", "WebServiceState_EndOfTrialDate", Function(c) c.DateTime())
AddColumn("dbo.Services", "WebServiceState_ServiceStopAtDate", Function(c) c.DateTime())
DropColumn("dbo.Services", "WebServiceState")
DropColumn("dbo.Services", "WebServiceRegistrationDate")
DropColumn("dbo.Services", "WebServiceEndOfTrialDate")
DropColumn("dbo.Services", "WebServiceExpirationDate")
End Sub
使用此代码,数据将丢失,因为新旧属性之间没有数据传输。
尝试的方法
为了保留数据,我尝试了以下方法,如如何在 Entity Framework 5 Code First 迁移中重命名数据库列而不丢失数据?.
1.使用重命名列
RenameColumn("dbo.Services", "WebServiceState", "WebServiceState_State")
这不起作用。PM-Konsole 报告
无法使用 Jet 重命名对象
2.使用SQL进行更新
Sql("Update dbo.Services SET [WebServiceState_State] = [WebServiceState]")
也不行。它会引发错误GenerteSqlStatementConcrete
3.使用数据库上下文在迁移Up方法中更改数据
恕我直言,这不是一种选择。这会导致状态不一致,因为模型已经处于迁移后状态,但数据库在表中仍然具有迁移前状态。模型和数据库不匹配,导致错误。
自数据库创建以来,支持“DbContext”上下文的模型已更改。考虑使用 Code First 迁移来更新数据库。
为了完成这项工作,我必须禁用模型检查,我认为这不是一件好事。(参考:迁移Up方法中的更改数据-实体框架)
问题
如何根据上面提到的我正在处理的限制(主要是 Jet Engine,由于 MS Access 数据库)重命名列/保留迁移数据?