在EF种子导入期间处理无效的外键

时间:2016-01-10 16:26:45

标签: entity-framework foreign-keys constraints seeding

在将数据从旧架构复制到新架构时,我发现旧数据中缺少外键的情况。例如,Vehicle表包含字段VehicleTypeId,该字段是指向表Id中主键VehicleType的链接。我导入的部分车辆记录的VehicleTypeIdVehicleType表格中不存在。

在新模式中,外键约束已到位,因此VehicleTypeId表中必须存在VehicleType才能使记录满足约束。我不想丢失记录,但我不确定VehicleTypeId给出了什么。

我考虑过分配VehicleTypeId = -1但是VehcileType表有一个不包含-1的基于身份的主键。我正在使用实体框架并通过代码播种该数据。播种VehicleType表以添加引用“未知车辆类型”的最后一行后是否有办法?

我认为其他人必须遇到这种情况。你做了什么?

1 个答案:

答案 0 :(得分:1)

是的,这正是我们所做的,假设您无法使VehicleTypeId成为可空。 SSIS对于这种事情来说是一个很好的工具,但是你可以将它锤入EF。因此,您需要为VehicleType表设定种子,存储对空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.
                                 }