从简单类型转换为复杂类型(表)时的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后,我将删除迁移文件夹)
我认为最好的方法是:
-
从模型中删除旧的
CarModel
字符串,并将新的Car实体添加到您的Person中,但在后面的迁移中,不要删除CarModel
列,而是将其重命名为[_Stale_CarModel]
(命名只是示例)。 -
在数据库上运行手动数据迁移脚本,验证数据是否已正确迁移——已为设置了
[_Stale_CarModel]
的行设置了ID,并且值正确。您可以手动添加EF迁移,其中包含您的数据迁移代码,或者如果您需要在提交实际迁移数据之前对数据执行验证脚本,或者如果迁移需要超过默认超时时间,则可以自行添加。 -
创建一个迁移来清理您的DB架构(EF将为此步骤创建空迁移)并手动写入
DropColumn("Person", "[_Stale_CarModel]")