Сначала я борюсь с кодом Entity Framework и сливаюсь.У меня есть контроллер MVC с общим хранилищем.Модель представления публикуется, и я преобразую ее в тип, о котором EF знает
var converted = AutoMapper.Mapper.Map<RoutineViewModel, Routine>(result);
_routineRepository.Update(converted);
В репозитории у меня есть:
/*
Routines.Attach(item);
ChangeTracker.Entries<Routine>().Single(x => x.Entity.Id == item.Id).State = EntityState.Modified;*/
var match = Routines.Single(x => x.Id == item.Id);
var entity = Entry(match);
entity.CurrentValues.SetValues(item);
Я закомментировал первый бит, потому что он былвыдает ошибку о том, что уже отслеживает сущность, хотя проверка, подобная этой:
if (ChangeTracker.Entries<Routine>().Count(x => x.Entity.Id == item.Id) != 0)
вернула false
Проблема, с которой я столкнулся, состоит в том, что у объекта Routine есть свойство ICollection из Steps.Когда я устанавливаю значения отслеживаемой сущности так, чтобы они совпадали со значениями poco, изменения ICollection не распространяются вниз.Просматривая этот сайт, вы увидите несколько неприятных рекурсивных звонков.Это действительно так работает или я что-то упустил?
Есть ли какой-нибудь простой способ сказать, что это исходный объект (неотслеживаемый), скопировать все о нем в отслеживаемый объект?
Просто чтобы прояснить ситуацию, я не думаю, что сначала получить объект и обновить его свойства нужно за пределами репозитория.Это, кажется, не только вынуждает вас передавать ваши модели данных через границы домена, но и вместо эквивалентного SQL-подобного оператора (update x, y, где id = 1) вместо (вставить во временную таблицу, где id = 1, для достижениястрока в таблице временных параметров, обновите x ..... теперь для каждой строки в таблице обновлений таблицы x = tempx, где id = 1)
Edit - проблема в том, что setValues не является рекурсивным вызовом.У рутинного объекта есть 2 простых свойства (id и name) и одно сложное (ICollection).Если входящий элемент изменил имя и изменились некоторые шаги, setValues фиксирует изменение имени, но не относится к дочерним элементам.Есть ли другой способ сделать это?Мне кажется немного скрипучим, что я должен прокрутить эту функцию вручную