2011-05-01 4 views
5

I가 내가 엔티티 모델을 생성 할 때 그들이 어떤 이유로, 링크 테이블 UserInRole엔티티 프레임 워크 : 생성되지 탐색 속성

를 사용하여 연결되어있는 두 개의 테이블 UserUserRole, 엔티티 UserInRole 생성되지 않습니다.

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' 

같은 쿼리를 구현해야합니다 : 당신이 그림에서 볼 수 있듯이, 엔티티 프레임 워크는 UserUserRole 사이의 다 대다 관계가 있음을 이해 내비게이션 속성이 존재한다면 일반적인 저장소를 사용하고 있습니다.

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 엔터티를 생성하지 않으므로 해당 상황에서 어떻게해야합니까? 엔티티 UserInRoleUserRole 사이의 링크를 제거하여 모델에 생성 된 엔티티 UserInRole을 얻거나 데이터베이스에서 변경하지 않고 위에서 설명한 쿼리를 수행 할 수있는 방법이 있습니까?

그래서 오류 Cannot implicitly convert type 'System.Collections.Generic.List<System.Collections.Generic.IEnumerable<string>>' to 'string[]' 아이디어 점점 그

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

같은 것을 할 필요가 보이는

업데이트?

+0

귀하의 문제를 : 업데이트 된 섹션의 첫 번째 선택 항목은 ** 사용자 목록 **을 선택합니다 - 하나 또는 여러 사용자가 포함되어 있는지 여부는 상관 없지만 ** 사용자 ** 목록이며 사용자를 선택한 사용자의 목록입니다. 역할 '이름 - 그래서 당신은 배열의 목록을 가지고, 기본적으로 - 오류가 무엇을 알려줍니다. –

답변

8

EF 모델에 해당 링크 테이블이 필요하지 않습니다! 그것은 EF의 아름다움입니다 !!

당신의 엔티티 User 확인 - 그것은 UserRoles 탐색 속성이있다 - 즉,이 사용자가있는 모든 역할의 컬렉션의를

체크 아웃 기업 UserRole는 :. 그것은이있는 모든 사용자가 탐색 속성 Users있다 역할. 이 두 다중 값 탐색의 호텔을

, 당신은 당신이 할 수 있습니다 쿼리 중 하나를 표현할 수있다 :

  • 가 주어진 역할 (그 .Users 특성을 UserRole 실체를 찾아 열거)
  • 모든 사용자를 찾을 수 그렇게하지 -
  • 특정 사용자에 대한 모든 역할을합니다 (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(); 
+0

+1 더 빠르고 좋은 설명을 위해 – Damb

+0

그래, 나는 그 속성을 보았다. 그리고 나는 그것이 일종의 EF 마법 일이라고 생각하고 있었다. ... 그 예기치 않은 혼란 후에 질문을 찾으려고 노력했다. – Kuncevic

+0

질문 : – Kuncevic