从简单类型转换为复杂类型(表)时的EntityFramework6迁移

本文关键字:时的 EntityFramework6 迁移 类型 简单 类型转换 复杂 | 更新日期: 2023-09-27 18:26:57

我有这样的东西:

class Person
  string CarModel

就数据库而言,它被转换为具有"MyProperty"字符串列的MyClass表。

现在我有:

class Person
  string CarId
class Car
   int Id
   string Model

其中EF转换为两个表:MyClass和MyNewClass,并且有Car.CarId->指向Car.Id。到目前为止还不错。

我将用Person.CarModel列中的项目手动填充Car表。但问题是:我该如何迁移数据?我希望Person.CarId指向正确的Car.Id记录。我在想:

UPDATE [dbo].[Person]
SET [CarId] = cars.Id
   FROM [dbo].[Cars] cars
WHERE cars.Model = [dbo].[Cars].CarModel

我在添加新列(CarId)和从表中删除旧列(CarModel)之间执行此操作。但是,SQL服务器会抱怨"CarId列不存在"。我想这与事务性的更改有关。

正确的方法是什么?我正在使用脚本(即,在从中生成.sql后,我将删除迁移文件夹)

从简单类型转换为复杂类型(表)时的EntityFramework6迁移

我认为最好的方法是:

  1. 从模型中删除旧的CarModel字符串,并将新的Car实体添加到您的Person中,但在后面的迁移中,不要删除CarModel列,而是将其重命名为[_Stale_CarModel](命名只是示例)。

  2. 在数据库上运行手动数据迁移脚本,验证数据是否已正确迁移——已为设置了[_Stale_CarModel]的行设置了ID,并且值正确。您可以手动添加EF迁移,其中包含您的数据迁移代码,或者如果您需要在提交实际迁移数据之前对数据执行验证脚本,或者如果迁移需要超过默认超时时间,则可以自行添加。

  3. 创建一个迁移来清理您的DB架构(EF将为此步骤创建空迁移)并手动写入DropColumn("Person", "[_Stale_CarModel]")