asp.net - 使用 Jet 引擎使用 Entity Framework (代码优先)重命名列(并保留数据)

标签 asp.net entity-framework ms-access jet-ef-provider

我正在寻找一种解决方案来重命名保留值的表的列,使用 Entity Framework 代码首先迁移 Jet 引擎数据库提供程序(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

使用此代码,数据将丢失,因为新旧属性之间没有数据传输。

尝试过的方法

为了保留数据,我尝试了以下在 How to rename a database column in Entity Framework 5 Code First migrations without losing data? 中找到的方法.

<强>1。使用 RenameColumn

RenameColumn("dbo.Services", "WebServiceState", "WebServiceState_State")

这是行不通的。 PM-Konsole 报告

Cannot rename objects with Jet

<强>2。使用 SQL 进行更新

Sql("Update dbo.Services SET [WebServiceState_State] = [WebServiceState]")

也不行。它在 GenerteSqlStatementConcrete

上抛出错误

Exception

<强>3。使用数据库上下文更改迁移 Up 方法中的数据

恕我直言,这不是一个选项。它导致不一致的状态,因为模型已经处于迁移后状态,但数据库在表中仍然具有迁移前状态。模型和数据库不匹配,导致错误。

The model backing the 'DbContext' context has changed since the database was created. Consider using Code First Migrations to update the database.

要完成这项工作,我必须禁用模型检查,我认为这不是一件好事。 (引用:Change data in migration Up method - Entity Framework)

问题

如何根据我正在处理的上述限制(主要是由于 MS Access 数据库导致的 Jet 引擎)重命名列/保留迁移数据?

最佳答案

除了我对bubi的回答的评论,这里是我最终使用的代码。请确保您使用的是 JetEntityFrameworkProvider 1.2.7 或更高版本。迁移不支持以下 SQL 语句 (reference)。

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())

    Sql("UPDATE Services SET [WebServiceState_State] = [WebServiceState]")
    Sql("UPDATE Services SET [WebServiceState_RegistrationDate] = [WebServiceRegistrationDate]")
    Sql("UPDATE Services SET [WebServiceState_EndOfTrialDate] = [WebServiceEndOfTrialDate]")
    Sql("UPDATE Services SET [WebServiceState_ServiceStopAtDate] = [WebServiceExpirationDate]")

    DropColumn("dbo.Services", "WebServiceState")
    DropColumn("dbo.Services", "WebServiceRegistrationDate")
    DropColumn("dbo.Services", "WebServiceEndOfTrialDate")
    DropColumn("dbo.Services", "WebServiceExpirationDate")
End Sub

关于asp.net - 使用 Jet 引擎使用 Entity Framework (代码优先)重命名列(并保留数据),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46053838/

相关文章:

javascript - 使用javascript上传图片到服务器

c# - 管理 EntityConnection 生命周期

vba 格式函数错误地将数字解释为日期

c# - Entity Framework 代码优先迁移的异常

sql - 子类型数据库表

vba - 如何阻止Access提示 "Do you want to save changes to the layout of query"

c# - 如何对 Unicode 进行编码以便 iPad 和 Excel 都能理解?

asp.net - html 5 文档类型和更旧的浏览器

asp.net - EF5 Code First ALTER TABLE 语句与 FOREIGN KEY 约束冲突

c# - EF 核心 'another instance is already being tracked'