Entity Framework: Наследование, изменение типа объекта

Скажем, у меня есть 2 класса в модели: Пользователь (сопоставлен с таблицей USERS) и PrivilegedUser (наследует пользователя, дополнительная информация хранится в таблице PRIVILEGEDUSERS).

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

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


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

Ответы

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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

UserPrivileges
UserId PrivilegeId

привилегии
Id Описание

Ответ 5

Как сказано, вы не можете. Либо хранимые процедуры, либо пользовательский запрос на вставку/обновление. У меня была аналогичная проблема, теперь я использую решение, которое я описал в этом ответе: fooobar.com/info/389732/...