Массовая вставка с дочерними объектами с использованием расширений EF6
Я получаю сообщение об ошибке каждый раз, когда пытаюсь выполнить массовую вставку с использованием библиотеки расширений EF6.
Когда используешь
IncludeGraph
, некоторые параметры должны быть установлены вIncludeGraphBuilder
(См.: https://entityframework-extensions.net/include-graph). Следующие параметры должны быть указаны вIncludeGraphBuilder: ColumnPrimaryKeyExpression, LambdaPrimaryKeyExpression
Схема выглядит следующим образом:
Customer(PK,____,AddressId)
CustomerAddress(PK,____,AddressLookupId)
CustomerPhone(PK,___,CustomerId)
AddressCities(PK,CityName)
AddressLookup(PK,Zip,CityId, StateId)
У меня есть следующая таблица поиска
AddressStates(PK,_____)
варианты заполнения данных следующие
options.InsertIfNotExists = true;
options.IncludeGraph = true;
options.IncludeGraphOperationBuilder = operation =>
{
switch (operation)
{
case BulkOperation<Customer> customer:
customer.InsertIfNotExists = true;
customer.ColumnPrimaryKeyExpression = x => new {
x.FirstName, x.MiddleName, x.LastName};
customer.AutoMapOutputDirection = true;
//customer.LambdaPrimaryKeyExpression =
customer.AutoMapIdentityExpression;
break;
case BulkOperation<CustomerAddress> customerAddress:
customerAddress.InsertIfNotExists = true;
customerAddress.ColumnPrimaryKeyExpression = x =>
new { x.Address };
customerAddress.AutoMapOutputDirection = true;
//customer.LambdaPrimaryKeyExpression =
customer.AutoMapIdentityExpression;
break;
case BulkOperation<CustomerPhone> customerPhone:
customerPhone.InsertIfNotExists = true;
customerPhone.ColumnPrimaryKeyExpression = x =>
x.PhoneNumber;
//customerPhone.LambdaPrimaryKeyExpression =
customerPhone.AutoMapIdentityExpression;
customerPhone.AutoMapOutputDirection = true;
break;
case BulkOperation<AddressCity> addressCity:
addressCity.InsertIfNotExists = true;
addressCity.ColumnPrimaryKeyExpression = x =>
x.City;
//addressCity.LambdaPrimaryKeyExpression =
addressCity.AutoMapIdentityExpression;
addressCity.AutoMapOutputDirection = true;
break;
case BulkOperation<AddressLookup> addressLookup:
addressLookup.InsertIfNotExists = true;
addressLookup.ColumnPrimaryKeyExpression = x =>
new { x.Zip, x.CityId, x.StateId };
//addressLookup.LambdaPrimaryKeyExpression =
addressLookup.AutoMapIdentityExpression;
addressLookup.AutoMapOutputDirection = true;
break;
Я также попытался настроить ColumnPrimaryKeyExpression для сопоставления столбцов, которые должны оставаться уникальными, и безуспешно.
Обновление 1: добавлены параметры клиента внутри построителя графиков, ошибка изменилась на нарушение ограничения FK для города, хотя для него установлено разрешение только на несуществующие города.
2 ответа
Мне удалось решить проблему, добавив
<EntityType>.AllowDuplicateKeys = false;
и у меня было нулевое значение ключа в некоторых записях, поэтому мне пришлось их отфильтровать
Вы не устанавливаете никаких настроек для клиента. Вероятно, в этом проблема