Код: Выделить всё
var groupToUpdate = await context.Groups
.Include(g => g.Employees)
.FirstOrDefaultAsync(...);
//Used for UI, list of additional employees for selective adding
var employeeList = await context.Employees.
.Where(...)
.ToListAsync();
На том же экране пользователь добавляет некоторых сотрудников в группу, удаляет некоторых сотрудников из группы и оставляет некоторых существующих сотрудников в группе нетронутыми. Все сотрудники являются существующими объектами в БД с существующими первичными ключами. Все изменения, внесенные до сих пор, относятся только к отключенному объекту в памяти.
Когда пользователь нажимает кнопку «Сохранить», объект groupToUpdate отправляется в мой внутренний код. Обратите внимание, что мы не отслеживаем, какие сотрудники добавляются/удаляются/оставляются в покое, мы просто хотим, чтобы эта группаToUpdate полностью переопределяла старую сущность, в частности, заменяя старую коллекцию сотрудников новой. .
Для этого серверный код сначала снова загружает группу из базы данных, чтобы начать отслеживать ее в контексте. Затем я пытаюсь обновить объект, в том числе заменяя старую коллекцию новой:
Код: Выделить всё
public async Task UpdateGroupAsync(Group groupToUpdate)
{
var groupFromDb = await context.Groups
.Include(g => g.Employees)
.FirstOrDefaultAsync(...);
// Update non-navigation properties such as groupFromDb.Note = groupToUpdate.Note...
groupFromDb.Employees = groupToUpdate.Employees;
await context.SaveChangesAsync();
}
Экземпляр типа сущности «Сотрудник» не может быть отслеживается, поскольку другой экземпляр со значением ключа... уже отслеживается
Поэтому кажется, что EF Core пытается отслеживать оба объекта «Сотрудник» только что загруженные из БД с помощью groupFromDb и из groupToUpdate, хотя последний просто передается как параметр из отключенного состояния.
Мой вопрос как справиться с такого рода обновлениями с наименьшими сложностями? Нужно ли отслеживать добавленные/удаленные объекты вручную и добавлять/удалять их вместо того, чтобы пытаться заменить всю коллекцию?
Подробнее здесь: https://stackoverflow.com/questions/683 ... ll-replace
Мобильная версия