Работа с недопустимыми внешними ключами во время импорта заполнения EF

При копировании данных из старой схемы в новую я обнаружил случаи, когда в старых данных отсутствуют внешние ключи. Например, таблица Vehicle содержит поле VehicleTypeId, которое является ссылкой на первичный ключ Id в таблице VehicleType. Некоторые импортируемые записи о транспортных средствах содержат VehicleTypeId, которого нет в таблице VehicleType.

В новой схеме действуют ограничения внешнего ключа, поэтому VehicleTypeId должен присутствовать в таблице VehicleType, чтобы запись соответствовала этому ограничению. Я не хочу потерять запись, но я не уверен, что VehicleTypeId ей дать.

Я думал о назначении VehicleTypeId = -1, но поскольку таблица VehcileType имеет первичный ключ на основе идентификатора, который не включает -1. Я использую Entity Framework и заполняю эти данные с помощью кода. Есть ли способ после заполнения таблицы VehicleType добавить последнюю строку, которая будет ссылаться на «неизвестный тип транспортного средства»?

Я полагаю, что другие, должно быть, столкнулись с этой ситуацией. Что вы наделали?


person webworm    schedule 10.01.2016    source источник


Ответы (1)


Да, это именно то, что мы делаем, если вы не можете сделать VehicleTypeId обнуляемым. SSIS — отличный инструмент для таких вещей, но вы можете вбить его в EF. Итак, вам нужно заполнить таблицу VehicleType, сохранить ссылку на пустой идентификатор, а затем импортировать автомобили:

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.
                                 }
person Steve Greene    schedule 10.01.2016
comment
Я вижу, что ты говоришь. Я не знал, что метод Add вернет первичный ключ. - person webworm; 10.01.2016
comment
На самом деле, я обычно просто использую добавленную сущность сейчас, когда смотрю на свой код. Исправит. - person Steve Greene; 10.01.2016