#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.