在 EF 种子导入期间处理无效的外键
Dealing with invalid foreign keys during EF seeding import
在将数据从旧模式复制到新模式时,我发现了旧数据中缺少外键的情况。例如 Vehicle
table 包含一个字段 VehicleTypeId
,它是 table VehicleType
中主键 Id
的 link .我正在导入的一些车辆记录有 VehicleTypeId
VehicleType
table.
中不存在的 VehicleTypeId
在新架构中,外键约束已到位,因此 VehicleTypeId
必须出现在 VehicleType
table 中,以便记录满足约束。我不想丢失记录,但我不确定 VehicleTypeId
应该给它什么。
我想过分配 VehicleTypeId = -1
,但由于 VehcileType
table 有一个不包含 -1
的基于身份的主键。我正在使用 Entity Framework 并通过代码播种该数据。在播种 VehicleType
table 之后有没有办法添加引用 "unknown vehicle type" 的最后一行?
我想其他人一定 运行 遇到过这种情况。你做了什么?
是的,这正是我们所做的,假设您不能使 VehicleTypeId 可以为空。 SSIS 是处理此类事情的绝佳工具,但您可以将其加入 EF。因此,您需要为 VehicleType table 设置种子,存储对空 ID 的引用,然后导入车辆:
if (!db.VehicleTypes.Any(v => v.Description == "Unknown")
{
var emptyVehicleType = new VehicleType { Description = "Unknown" };
db.VehicleTypes.Add(emptyVehicleType);
db.SaveChanges(); // emptyVehicleType.VehicleTypeId will now be filled in
}
然后在车辆中插入:
var newVehicle = new Vehicle { VehicleTypeId = oldVehTypeId == 0 ? emptyVehicleType.VehicleTypeId: oldVehicleTypeId,
otherNewField = otherOldField,
etc.
}
在将数据从旧模式复制到新模式时,我发现了旧数据中缺少外键的情况。例如 Vehicle
table 包含一个字段 VehicleTypeId
,它是 table VehicleType
中主键 Id
的 link .我正在导入的一些车辆记录有 VehicleTypeId
VehicleType
table.
VehicleTypeId
在新架构中,外键约束已到位,因此 VehicleTypeId
必须出现在 VehicleType
table 中,以便记录满足约束。我不想丢失记录,但我不确定 VehicleTypeId
应该给它什么。
我想过分配 VehicleTypeId = -1
,但由于 VehcileType
table 有一个不包含 -1
的基于身份的主键。我正在使用 Entity Framework 并通过代码播种该数据。在播种 VehicleType
table 之后有没有办法添加引用 "unknown vehicle type" 的最后一行?
我想其他人一定 运行 遇到过这种情况。你做了什么?
是的,这正是我们所做的,假设您不能使 VehicleTypeId 可以为空。 SSIS 是处理此类事情的绝佳工具,但您可以将其加入 EF。因此,您需要为 VehicleType table 设置种子,存储对空 ID 的引用,然后导入车辆:
if (!db.VehicleTypes.Any(v => v.Description == "Unknown")
{
var emptyVehicleType = new VehicleType { Description = "Unknown" };
db.VehicleTypes.Add(emptyVehicleType);
db.SaveChanges(); // emptyVehicleType.VehicleTypeId will now be filled in
}
然后在车辆中插入:
var newVehicle = new Vehicle { VehicleTypeId = oldVehTypeId == 0 ? emptyVehicleType.VehicleTypeId: oldVehicleTypeId,
otherNewField = otherOldField,
etc.
}