Структура сущности и наследование: NotSupportedException - PullRequest
10 голосов
/ 01 августа 2010

Я получаю

System.NotSupportedException: все объекты в EntitySet Entities.Message должны иметь уникальные первичные ключи.Однако экземпляр типа Model.Message и экземпляр типа Model.Comment имеют одинаковое значение первичного ключа

, но я понятия не имею, что это значит.

Используя EF4, у меня есть группа сущностей типа Message.Некоторые из этих сообщений на самом деле являются подтипом, комментарием, наследованием по типу таблицы.Просто

 DB.Message.First();

выдаст исключение.У меня есть другие случаи подтипов, где у меня нет проблем, но я не вижу никаких несоответствий.Иногда, однако, проблема исчезает, если я перезагружаю сервер разработки, но не всегда.

Редактировать: я понял (должен был раньше), что проблема заключается в ошибке хранимой процедуры, извлекающей мои сообщения,То, как это в настоящее время настроено так, что все поля, относящиеся к Message, выбираются, таблица комментариев игнорируется sproc.Затем контекст перекраивает это, возможно, снова выбирая те Сообщения, которые также являются Комментариями, как вы и предлагали.Как сделать это правильно - центральный вопрос.Я нашел некоторые указания на решение в http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/bb0bb421-ba8e-4b35-b7a7-950901adb602.

Ответы [ 3 ]

2 голосов
/ 30 ноября 2010

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

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

Другим вариантом может быть использование модели «Таблица на иерархию». Это приводит к плохому дизайну базы данных, но в конце концов вы должны использовать то, что работает.

Возможно, вам удастся избежать этой проблемы, предварительно загрузив объекты в качестве комментариев. Таким образом, когда вы запрашиваете Сообщение, Контекст уже знает о нем.

Также рассмотрите возможность использования Композиция над наследованием , чтобы в сообщении было 0..1 CommentDetails.

Последнее предложение - удалить зависимость от Entity Framework из вашего кода управления и создать уровень доступа к данным, который ссылается на EF и извлекает ваши объекты. DAL может превратить объекты Entity Framework в другой набор объектов Entity, которые легче использовать в коде. Этот подход приведет к большим накладным расходам кода, но может быть целесообразным, если вы не можете использовать Entity Framework для создания модели Entity, которая представляет ваши сущности так, как вы хотите с ними работать.

Подводя итог, если MS не решит эту проблему, не существует решения вашей проблемы, которое не предполагает переосмысления вашего подхода. К сожалению, Entity Framework не идеален, особенно для сложных моделей Entity - вам может быть лучше создать свой собственный DAL и вообще обойти EF.

1 голос
/ 13 сентября 2010

Звучит так, как будто вы записываете две записи в память, одну в сообщение, а другую в комментарий.

Возможные проблемы:

  • Есть два физических сообщения с одинаковым идентификатором
  • Одно и то же сообщение выводится как сообщение и комментарий
  • Одно и то же сообщение дважды выводится в один и тот же контекст

То, что проблема иногда исчезаетпри перезагрузке указывает на проблему с очисткой контекста.Используете ли вы операторы «using».

Есть ли у вас функциональность для перехода от сообщения к комментарию?

0 голосов
/ 07 сентября 2010

Я не из тех, кто любит EF (занят работой с NHibernate, у меня еще не было времени познакомиться с EF), поэтому я могу быть совершенно не прав, но может быть проблема в том, что две таблицы (так как вы используете наследование по таблице на тип) есть первичные ключи, которые сталкиваются?

Если вы проверяете данные в обеих таблицах, конфликтуют ли значения первичного ключа?

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