Массовые расширения ядра Entity Framework: BulkInsertOrUpdate

#c# #entity-framework-core

#c# #entity-framework-core

Вопрос:

У меня есть требование к функции массовых расширений ядра entityfremawwork. когда мы используем _context.BulkInsertOrUpdate (клиенты); Я не создал никакого первичного ключа в таблице клиентов sql. Итак, я пытаюсь отобразить целевые столбцы (вставить или обновить) извне, как показано ниже

 context.BulkInsertOrUpdate()
  .MatchTargetOn(x => x.CustomerId)
  .MatchTargetOn(x => x.CustomerName)
  .Commit(db.Database.Connection);
 

Есть ли какой-либо способ в массовых расширениях ядра ef

Комментарии:

1. Итак, вы выбрали стороннее расширение, которое поддерживает сопоставление только через PK.

Ответ №1:

Решения нет, если библиотека не поддерживает такое сопоставление. Поэтому подумайте о том, чтобы сменить стороннюю библиотеку на другую или дождаться реализации функции.

Кстати, я создал этот мост между linq2db и EF Core linq2db.EntityFrameworkCore, поэтому, если у вас нет других вариантов, этот должен работать.

 context.Customers
   .ToLinqToDBTable()
   .Merge()
   .Using(entities)
   .On((t, s) => t.CustomerId == s.CustomerId || t.CustomerName == s.CustomerName)
   .InsertWhenNotMatched()
   .UpdateWhenMatched()
   .Merge();
 

Проверьте перегрузки InsertWhenNotMatched и UpdateWhenMatched — здесь вы можете настроить, какие поля следует вставлять или обновлять, даже на основе значений из целевой таблицы.

Ответ №2:

Отказ от ответственности: я являюсь владельцем расширений Entity Framework

Эта библиотека не является бесплатной, но легко охватывает такие сценарии, как пользовательские ключи. Эквивалентно InsertOrUpdate BulkMerge .

Пример:

 context.BulkMerge(list,  options => options.ColumnPrimaryKeyExpression = c => 
    new { c.CustomerId, c.CustomerName });
 

Вот онлайн-пример: https://dotnetfiddle.net/Lzbh2H

Комментарии:

1. Привет, Джонатан Маньян,

2. Я пытаюсь использовать github.com/borisdj/EFCore . Расширенные расширения и загруженный EFCore. BulkExtensions (nuget 3.3.1). Пожалуйста, сообщите нам, что этот пакет nuget 3.3.1 является бесплатным, или нам придется приобрести лицензию.

3. @user1926055. Это бесплатно, но не работает для вас 🙂

4. @user1926055, пакет, созданный borisdj, отличается от нашей библиотеки. Вот наш пакет: nuget.org/packages/Z.EntityFramework . Расширения. EFCore , существует бесплатная пробная версия, поэтому вы можете попробовать ее, просто загрузив и используя пакет NuGet.