Entity Framework запрос «многие ко многим»: свойство навигации не сгенерировано - PullRequest
5 голосов
/ 01 мая 2011

У меня есть две таблицы User и UserRole, которые связаны между собой с помощью таблицы ссылок UserInRole

Когда по какой-то причине я генерирую модель сущности, сущность UserInRole не генерируется,И как вы можете видеть из рисунка, Entity Framework понимает, что существует отношение «многие ко многим» между User и UserRole:

enter image description here

Мне нужно реализоватьзапрос, подобный этому

select ur.Name from [User] as u
inner join UserInRole uir on uir.UserId = u.Id
inner join UserRole ur on ur.Id = uir.UserRoleId
where u.Username = 'magename'

Я использую универсальный репозиторий, если свойство навигации существует, запрос будет выглядеть следующим образом:

from u in repository.AsQueryable<User>()
join uir in repository.AsQueryable<UserInRole>() on u.Id equals uir.UserId
join ur in repository.AsQueryable<UserRole>() on uir.UserId equals ur.Id
where u.Username == userName
select ur.Name

Но Entity Framework не генерирует UserInRoles навигациюсобственности и связанной с ней UserInRole сущности, поэтому вопрос, что мне делать в такой ситуации?Должен ли я удалить связь между UserInRole и UserRole, чтобы получить сущность UserInRole, сгенерированную в модели, или есть какой-либо способ получить запрос, описанный выше, без каких-либо изменений в базе данных?

UPDATED

так выглядит, мне нужно сделать что-то подобное

stirng[] roles = (from u in repository.AsQueryable<User>()
         where u.Username == userName
         select ur.UserRoles.Select(x => x.Name)).ToArray<string>();

получить ошибку Cannot implicitly convert type 'System.Collections.Generic.List<System.Collections.Generic.IEnumerable<string>>' to 'string[]' есть идеи?

1 Ответ

8 голосов
/ 01 мая 2011

Вам не нужна эта таблица ссылок в вашей модели EF!В этом прелесть EF !!

Проверьте свою сущность User - у нее есть UserRoles свойство навигации - это коллекция всех ролей, в которых находится этот пользователь.

Проверить сущность UserRole: у него есть свойство навигации Users, в котором есть все пользователи, выполняющие эту роль.

С помощью этих двух многозначных свойств навигации вы можете выражать любые запросы, которые вам могут понадобиться:

  • найти всех пользователей для данной роли (найти сущность UserRole и перечислить ее свойство .Users)
  • найти все роли для данного пользователя (найти User и перечислить его.UserRoles)

EF и EDM как бы «скрывают» эту таблицу ссылок от вас - она ​​вам действительно не нужна, когда вы выражаете свое намерение в концептуальной модели;эти таблицы ссылок являются просто «необходимым злом» в реляционных базах данных, поскольку эти базы данных не могут моделировать отношения m: n любым другим способом.

Обновление: так что вы, кажется, хотите найти список всех ролей пользователей (их имен), в которых находится конкретный пользователь - вы можете выразить это примерно так:

// find the user in your "dbContext" (or via your repository)
var user = _dbContext.Users.FirstOrDefault(u => u.Name == "magename");

// from the list of UserRoles on that user, select the names only
var userRolesNames = user.UserRoles.Select(ur => ur.Name).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...