2009-08-06 3 views
13

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

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

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


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

ответ

0

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

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

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

Пользователи
Id Имя пользователя ...

UserPrivileges
UserId PrivilegeId

Privileges
Id Описание

+1

Это правильно. Экземпляр должен/не может изменять тип. Итак, что происходит, когда пользователь становится привилегированным или непривилегированным? –

+0

@Craig, любые новости? Я столкнулся с тем же вопросом. – Shimmy

+0

@ Шимми, "новости?" Какие новости? Если вы думаете, что ваш объект должен изменить тип, вы, вероятно, злоупотребляете наследованием. @ Ответ DanDan по-прежнему является лучшей идеей. –

3

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

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

1

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

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

0

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