2014-04-01 2 views
1

나는 다음과 같은 클래스가 :엔티티 프레임 워크 가상 컬렉션을 초기화

public class User 
{ 
     public Guid Id { get; set; } 
     public string UserName { get; set; } 
     //... Other properties here 

     public virtual ICollection<Role> Roles { get; set; } 
} 

및 역할 클래스 각 사용자 인스턴스 "RegularUser 같은 적어도 역할에 (기본 역할을하는 내가 원하는

public class Role 
    { 
     public Guid Id { get; set; } 
     public string Name { get; set; } 

     public virtual User User { get; set; } 
    } 

을 "역할). 새 사용자를 구성하고 역할을 할당하지 않고 DB에 추가하는 경우 검색시 롤 컬렉션이 비어 있어야합니다.

사용자 생성자에서 역할 컬렉션을 인스턴스화하고 기본 역할을 추가해야합니까? DB에 이미 일부 역할이있는 경우 Roles 컬렉션을 덮어 쓰지 않겠습니까? 가상 컬렉션이 정확히 초기화되는 시점은 언제입니까?

이 문제는 어떻게 해결해야합니까?

감사합니다, 누트

답변

1

는 EF 클래스 모델은 주로 데이터 액세스 계층이 아닌 도메인 층임을 내 의견의 이유입니다. EF 클래스의 지속 된 컬렉션에 기본 개체를 추가하지 않습니다.

콜렉션이 비어있는 경우 항상 Role을 추가한다고 가정합니다. getter에서 :

public virtual ICollection<Role> Roles 
{ 
    get 
    { 
     if (!this._roles.Any()) // initialized in the constructor 
      this._roles.Add(new Role {...}); 
     return this._roles; 
    } 
    set { this._roles = value; } 
} 

이로 인해 일관성없는 동작이 발생합니다. EF가 User 개체를 데이터베이스에서 가져온 경우 쿼리에 따라 Roles에 완전히 새로운 컬렉션을 할당 할 수 있지만 항목을 추가 할 수도 있습니다. 예를 들어 Includeuser.Roles을 선택하는 것과 다릅니다. 후자의 경우 기본 역할은 이고 항상이 컬렉션에 포함됩니다. 이전의 경우 이 아닙니다. (이 모든 것을 설명하는 주제는 약간 떨어져 있으며 모든 내부 기계를 파악할 수 있을지 확실하지 않습니다.) 또한 실수로 데이터베이스에 기본 역할을 저장할 수도 있습니다.

권한 부여 논리에서 역할이 적은 사용자를 처리 할 것입니다. 사용자의 권한을 평가할 때 User의 역할에서 임시로 메모리에 빌드하는 로컬 역할 모음에 항상 기본 역할을 추가 할 수 있습니다.

기본 역할을 표시하려면 역할을 추가 할 수있는보기 모델을 표시하는 것이 좋습니다.

-1

모든 생성 객체 논리에 대해 팩토리를 사용하십시오.