Ответ 1
Сначала (еще нет ответа), AddOrUpdate
можно вызвать с помощью массива новых объектов, поэтому вы можете просто создать массив типа City[]
и вызвать context.CitySet.AddOrUpdate(cc => cc.Id, cityArray);
один раз.
(отредактирован)
Во-вторых, AddOrUpdate
использует выражение идентификатора (cc => cc.Id
), чтобы найти города с тем же Id
, что и те, что находятся в массиве. Эти города будут обновлены. Другие города в массиве будут вставлены, но их значения Id
будут сгенерированы базой данных, потому что Id
является столбцом идентификации. Его нельзя установить с помощью инструкции insert. (Если вы не установили Insert Identity). Поэтому при использовании AddOrUpdate
для таблиц с столбцами идентификации вы должны найти другой способ идентифицировать записи, поскольку значения идентификатора существующих записей непредсказуемы.
В вашем случае вы использовали Slug
как идентификатор для AddOrUpdate
, который должен быть уникальным (в соответствии с вашим комментарием). Мне непонятно, почему это не обновляет существующие записи с помощью соответствия Slug
s.
Я установил небольшой тест: добавьте или обновите объект с идентификатором (iedntity) и уникальным именем:
var n = new Product { ProductID = 999, ProductName = "Prod1", UnitPrice = 1.25 };
Products.AddOrUpdate(p => p.ProductName, n);
SaveChanges();
Когда "Prod1" еще нет, он вставлен (игнорируется Id 999).
Если он и UnitPrice
отличается, он обновляется.
Глядя на испущенные запросы, я вижу, что EF ищет уникальную запись по имени:
SELECT TOP (2)
[Extent1].[ProductID] AS [ProductID],
[Extent1].[ProductName] AS [ProductName],
[Extent1].[UnitPrice] AS [UnitPrice]
FROM [dbo].[Products] AS [Extent1]
WHERE N'Prod1' = [Extent1].[ProductName]
И далее (когда совпадение найдено и UnitPrice
отличается)
update [dbo].[Products]
set [UnitPrice] = 1.26
where ([ProductID] = 15)
Это показывает, что EF обнаружил одну запись и теперь использует поле ключа для обновления.
Я надеюсь, что, увидев этот пример, прольет свет на вашу ситуацию. Возможно, вам следует также следить за заявлениями sql и видеть, произошло ли что-то неожиданное.