Entity Framework: Наследование, изменение типа объекта - PullRequest
13 голосов
/ 06 августа 2009

Допустим, у меня есть 2 класса в модели: User (сопоставленный с таблицей USERS) и PrivilegedUser (наследующий User, дополнительная информация хранится в таблице PRIVILEGEDUSERS).

Теперь у меня есть строка в USERS (и экземпляр User), и мне нужно преобразовать этого пользователя в PrivilegedUser (то есть создать запись в PRIVILEGEDUSERS с тем же Id). Есть ли способ сделать это без удаления / вставки?

Проблема в том, что в модели отсутствует представление PRIVILEGEDUSERS, поэтому вы не можете создать только эту часть PrivilegedUser.


Это был просто пример. PrivilegedUser может иметь некоторую скидку или персонального менеджера или что-то еще в дополнение к обычным свойствам пользователя. В то же время существуют другие таблицы, которые должны ссылаться на пользователей независимо от конкретного типа пользователя. Я реализовал это, используя режим наследования таблиц для типов. На уровне базы данных очень просто конвертировать пользователей из одного типа в другой (вам просто нужно вставить или удалить запись из таблицы расширений). Но в EF у вас есть только UserSet, в котором хранятся объекты User и PrivilegedUser. Вот почему я спрашиваю: можно ли заменить существующий объект пользователя на PrivilegedUser, сохранив существующий идентификатор и не удаляя запись из таблицы USERS.

Ответы [ 5 ]

3 голосов
/ 28 февраля 2010

Нет, вы не можете.

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

1 голос
/ 03 октября 2010

Вам нужно изменить свое мировоззрение. По вашему мнению, у вас есть стандартные пользователи со стандартными привилегиями и суперпользователи с дополнительными привилегиями. Привилегии не перечислены, они неявны.

Новое мировоззрение заключается в том, что вы ведете список всех привилегий, как стандартных, так и супер, а затем в таблице сопоставления вы создаете карту «многие ко многим», у которых пользователи имеют привилегии. Когда пользователю предоставляются супер привилегии, вы просто добавляете сопоставления для соответствующих привилегий в таблицу сопоставлений. Вам не нужен класс PrivilegedUser, просто список привилегий в классе User. Привилегии могут быть либо стандартными, либо супер.

0 голосов
/ 07 февраля 2015

Как сказано, вы не можете. Либо с помощью хранимых процедур или пользовательского запроса вставки / обновления. У меня была похожая проблема, теперь я использую решение, которое я описал в этом ответе: https://stackoverflow.com/a/28380804/2424989

0 голосов
/ 22 марта 2010

Что касается наследования в EF, взгляните на этот сайт, который объясняет три различных способа использования наследования в EF.

http://blogs.microsoft.co.il/blogs/gilf/archive/2010/01/20/entity-framework-inheritance-types.aspx

0 голосов
/ 06 августа 2009

Кажется неправильным, что у вас есть две таблицы, представляющие пользователей.

Не лучше ли иметь таблицу Users (для всех пользователей), а затем таблицу UserPrivileges, представляющую, что им разрешено делать? Таким образом, нет необходимости удалять / вставлять, и вы можете ссылаться только на одну таблицу для пользователей.

Третья таблица может использоваться для представления фактических привилегий.

Пользователи
Идентификатор пользователя ...

UserPrivileges
UserId PrivilegeId

привилегии
Идентификатор описания

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