Мой сценарий выглядит следующим образом. Пользователи вводят отредактированную информацию через пользовательский интерфейс, который хранится в экземплярах класса сущностей Upload.
Потенциально у меня может быть много отредактированных сущностей, поэтому я был рад найти ExecuteUpdate (), который будет выполнять только один вызов БД, а не один вызов для каждой сущности, как это было бы при использовании ChangeTracking и SaveChanges.
Однако , я не могу найти в коде способ установить значение для каждого из отредактированных свойств для каждого соответствующего объекта.
Вот мой код (не работает):
Код: Выделить всё
var editedUploads = editViewModel.SelectedIncomingStatements
.Select((d,Index) => new Upload() { Id = d.Id , BankRoyaltiesReceived = d.BankRoyaltiesReceived, ExchangeRate = d.ExchangeRate, Tag = Index});
var editedUploadIds = editedUploads.Select(u => u.Id).ToHashSet();
var erColl = new Collection(editedUploads.Select(u => u.ExchangeRate).ToList());
var rrColl = new Collection(editedUploads.Select(u => u.BankRoyaltiesReceived).ToList());
using (var trans = await ctx.Database.BeginTransactionAsync(cancellationToken))
{
try
{
var q = from u in ctx.Uploads
let c = editedUploadIds.Contains(u.Id)
where c == true
select u;
await q.ExecuteUpdateAsync(setters => setters.SetProperty(p => p.BankRoyaltiesReceived, u => rrColl[(int)u.Tag]).SetProperty(p => p.ExchangeRate, u => erColl[(int)u.Tag]));
await trans.CommitAsync(cancellationToken);
}
catch (Exception)
{
await trans.RollbackAsync(cancellationToken);
throw;
}
}
К счастью, похоже, что коллекции переводятся с помощью EF Core, поэтому их использование кажется нормальным. Я проверил это на коллекциях и жестко закодированных индексах, которые сработали. Изначально я пробовал использовать словари, но, согласно документации, это пока запрещено.
Поэтому я хочу предоставить коллекциям индексы, которые нормально транслируются для EF Core.
Как видно из кода, моей последней попыткой было добавить атрибут [NotMapped] к свойству .Tag объекта Upload и установить его с индексом, который понадобится из 2-х коллекций. К сожалению, это не сработало, поскольку перевод EF жалуется, что .Tag имеет значение [NotMapped] !
Итак, я застрял в том, как установить несколько свойств для несколько объектов, использующих ExecuteUpdate().
Я чувствую, что упускаю что-то очевидное, поскольку думаю, что этот сценарий - именно то, для чего нужен ExecuteUpdate()?
Есть предложения?
Заранее благодарим за любую помощь.
Подробнее здесь: https://stackoverflow.com/questions/781 ... pdate-from
Мобильная версия