EF4 - Обновление одной и той же строки таблицы дважды в одном и том же контексте из разных объектов не возможно? - PullRequest
0 голосов
/ 05 мая 2011

Когда я получаю одну и ту же строку таблицы дважды для обновления в одном и том же контексте, я получаю:

" AcceptChanges не может продолжаться, поскольку значения ключей объекта конфликтуют с другим объектом в ObjectStateManager. Перед вызовом AcceptChanges убедитесь, что значения ключей являются уникальными. "

Проблема возникает в методе ChangeState.

То, что у меня есть, можно упростить до этого:

        var obj1 = new test() { id = 1,name = "oiu"};
        var dc = Context.Create();

        dc.test.AddObject(obj1);
        if (dc.test.Any(a => a.id == obj1.id))
            dc.ObjectStateManager.GetObjectStateEntry(obj1).ChangeState(EntityState.Modified);
        dc.SaveChanges();

        //---- another iteration of the reading thread, another object, but same context:

        var obj2 = new test() { id = 1, name = "ois" };
        dc.test.AddObject(obj2);
        if (dc.test.Any(a => a.id == obj2.id))
            dc.ObjectStateManager.GetObjectStateEntry(obj2).ChangeState(EntityState.Modified);
        dc.SaveChanges();

Есть ли выход или вокруг?

Ответы [ 2 ]

1 голос
/ 05 мая 2011

Итак, что вы пытаетесь сделать?Вы сказали EF и базе данных (я полагаю), что «id» - это уникальный идентификатор объекта / строки.Затем вы сказали, что хотите добавить два объекта с одинаковым уникальным идентификатором («1») и ожидаете, что он справится с работой.

Хотите добавить объекты с одинаковым уникальным идентификатором?или вы хотите добавить один, а затем обновить существующую строку / объект, чтобы изменить свойство name с «oiu» на «ois».Если это первое, не делайте «id» pkid.если это последнее, не говорите EF, что вы хотите добавить объект дважды.Добавьте его один раз, обновите существующий объект.

0 голосов
/ 05 мая 2011

Вы можете подключить объект к контексту только один раз (загружая объект из базы данных или вызывая Attach или AddObject). Как только вы подключаете объект к контексту, вы обязаны использовать один и тот же экземпляр для всех модификаций. Контекст использует шаблон карты идентичности - это означает, что он отслеживает объекты по их уникальной идентификации (ключ сущности на основе первичного ключа и набора сущностей) и разрешает только один экземпляр типа с данным ключом сущности. Единственным исключением является добавление новых объектов, где EntityKey является временным до сохранения изменений, но это не тот случай, если вы меняете состояние на Modified.

Если вы не знаете экземпляр в оставшейся части теста, вы можете запросить ObjectStateManager.GetObjectStateEntries и найти свой экземпляр (каждая запись имеет свойство Entity, ссылающееся на экземпляр).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...