Как в Entity Framework указать условие для ассоциации? - PullRequest
3 голосов
/ 17 июня 2009

У меня есть реляционная модель с ассоциативной таблицей. Но в дополнение к связанным ключам эта таблица также имеет флаг. Я хотел бы определить две ассоциации: одна, где флаг является истинным, а другая, где он ложный. Дизайнер EF может добавить условие к объекту, но не к ассоциации.

Ассоциативная таблица выглядит так:

UserPrivilege
-------------
UserId int (FK1)
PrivilegeId int (FK2)
IsGranted bit

Я хотел бы создать две ассоциации между объектом User и объектом Privilege: PrivilegesGranted и PrivilegesDenied.

1 Ответ

2 голосов
/ 18 июня 2009

Вы не можете сделать это напрямую через дизайнера.

Но это возможно в XML, используя DefiningQuery и Create и Delete sprocs. См. Этот старый пост в моем блоге для получения дополнительной информации: Связи с полезными нагрузками .

Единственное, что немного интересно, я предполагаю, что PK это просто UserId и PrivilegeId, что означает, что пользователь не может быть одновременно предоставлен или отклонен для определенной привилегии.

Так что, если вы напишите такой код:

Privilege p = user.Granted.First();
user.Granted.Remove(p);
user.Denied.Add(p);
ctx.SaveChanges();

Порядок обновления важен. поскольку вы используете DefiningQuery для обеих ассоциаций, EF не знает, что они связаны, и что ему нужно выполнить удаление, прежде чем он сможет выполнить обновление.

Так что вы можете столкнуться с нарушениями PK.

Способ решения этой проблемы заключается в том, чтобы использовать спрок «Вставка» и «Удалить» для каждой ассоциации. Вы можете по существу заставить их изменить текущую строку для пары «Пользователь и привилегия», если она существует, обновить ее с правильным значением IsGranted, если не создать это, то есть сделать это упор.

Дайте мне знать, как вы сюда попали

Alex

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