Entity Framework 4 объединяет данные с отслеживаемым объектом - PullRequest
0 голосов
/ 24 февраля 2012

Сначала я борюсь с кодом 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 ​​фиксирует изменение имени, но не относится к дочерним элементам.Есть ли другой способ сделать это?Мне кажется немного скрипучим, что я должен прокрутить эту функцию вручную

1 Ответ

0 голосов
/ 24 февраля 2012

Из того, что я могу сказать, вы создаете свою сущность, заполняете свойства и затем присоединяете ее к БД.Это как-то не так с EF.

Если вы хотите прикрепить объект, который уже находится в БД, но не отслеживается, вы можете использовать присоединение, но записываются только изменения, сделанные после вызова присоединения, чтобы бытьсовершено в БД.Если вы хотите использовать метод attach, убедитесь, что вы внесли изменения после вызова этого метода.

Кроме того, EF позволяет только прикреплять объект, которого в данный момент нет в графе объектов.Поэтому, если вы попытаетесь прикрепить один и тот же объект дважды (или один с тем же ключом), вам будет выдана ошибка, например та, которую вы видите.

...