2014-09-19 1 views
-1

EF 6, Identity 2, ASP.NET MVC 5, 코드 우선사용자 지정 사용자 형식 또는 역할에 대한 쿼리?

내 응용 프로그램은 사용자 관리를 위해 ID를 사용합니다.

public class ApplicationUser : IdentityUser 
{ 
    // public async Task<ClaimsIdentity> GenerateUserIdentityAsync ... 

    public int SchoolId { get; set; } 

    public string FirstName { get; set; } 

    public string LastName { get; set; } 

    public string FullName 
    { 
     get { return String.Format("{0} {1}", FirstName, LastName); } 
    } 

    public virtual School School { get; set; } 
} 

나는 또한 두 가지 역할 사용하고 있습니다 : adminteacher을 좀 추가 특성을 가진 표준 ApplicationUser 있습니다. 대부분의 사용자는 teacher 역할을 가지며 일부 사용자는 admin 역할을합니다. 주어진 사용자에게 두 가지 역할 모두 또는 둘 다 적용되는 경우도있을 수 있습니다.

public class Teacher 
{ 
    public int Id { get; set; } 

    public string FirstName { get; set; } 

    public string LastName { get; set; } 

    public string FullName 
    { 
     get { return String.Format("{0} {1}", FirstName, LastName); } 
    } 

    public int SchoolId { get; set; } 

    public virtual School School { get; set; } 

    public virtual ICollection<TeacherAssignment> Assignments { get; set; } 
} 

이 모델뿐만 아니라 그들이 가르치는 과정 섹션에, 각각의 학교에 교사를 연결하는 데 유용합니다 다음과 같이

나는 또한, Teacher 모델을 가지고있다. 데이터베이스의 교사 액세스는 간단합니다.

public DbSet<Teacher> Teachers { get; set; } // teacher access 
... 
contextInstance.Teachers // get the current teachers 

이 시점까지 모두 훌륭합니다. 각보기에서 사용자와 역할을 관리하고 교사를 관리 할 수 ​​있습니다. 내 문제는 코드 중복이며 교사를 두 곳에서 유지 관리하는 오버 헤드가 추가되었습니다. 또한 교사는 가르침을 멈추지 만 여전히 사용자, 관리자 일 수 있습니다. 반대로 기존 사용자는 교사가되어야 할 수도 있습니다. 이 문제를 해결하기위한

내 아이디어 :

1)는 Teacher 모델 Teacher에서 중복 속성을 떨어 뜨리고, ApplicationUser을 확장 수정합니다. 중복이 없으며 간단하게 액세스 할 수 있습니다. 그래도 teacher 역할이 약간 중복됩니다. 또한 사용자는 더 이상 선생님이 아니기 때문에 교사 기록을 삭제해야합니다. 반대로 교사 기록은 기존 사용자를 동반하도록 만들어야합니다. 모든 교사는 사용자이지만 모든 사용자가 교사는 아닙니다.

2) Teacher 모델을 유지하지만, 그것은 ApplicationUser 인스턴스에 연결 한 :

public class Teacher { 
    public int Id { get; set; } 

    public int ApplicationUserId { get; set; } 

    public virtual ApplicationUser ApplicationUser { get; set; } 
} 

별도로 교사 관리에 일부 오버 헤드 및 해당 역할이 일부 중복하지만, 쉽게로 사용자로부터 얻을 수 있습니다 교사와 일치하거나 그 반대 일 수 있습니다. 똑같은 똑똑한 선생님 검색, 비 선생님을 돌려받을 위험 없음. 모든 사용자가 일치하는 교사 기록을 보유하지는 않습니다.

3) Teacher 모델 및 관련 데이터 액세스를 삭제하고 teacher 역할의 사용자를 검색하십시오. 이것은 적절한 사용자의 검색을 약간 복잡하게합니다. 이전에 표시된 교사 검색 쿼리는 도우미 함수에 대한 호출로 대체 할 수 없었다 :

// within a class that receives a reference to the context 
public IEnumerable<ApplicationUser> Teachers 
{ 
    get 
    { 
     var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(_context)); 

     var role = roleManager.FindByName("teacher"); 
     var roleId = role.Id; 

     var users = Users.Where(u => u.Roles.Any(r => r.RoleId == roleId)); 
     return users; 
    } 
} 

없음 복제 또는 추가 관리. 사용자가 활발한 선생님이 아닙니까? teacher 역할에서 사용자를 삭제하거나 역할에 사용자를 추가하여 다른 교사를 확보하십시오. 코드에 미치는 영향은 최소화되어야하며 직접 액세스에서 도우미 기능 사용으로 변경됩니다.

제 3의 옵션은 중복을 제거하고 다른 사용자 유형을 관리하기 위해 별도의보기가 필요하지 않으므로 구현하는 것이 쉽습니다. # 3은 이상적인 경로를 찾습니까? 아니면 더 잘 작동 할 수있는 다른 대안이 있습니까?

답변

0

Teacher 클래스가 필요합니까? 사용자가 아닌 Teacher이 있습니까?

public virtual ICollection<TeacherAssignment> Assignments { get; set; }ApplicationUser 클래스에 추가하면 메모리가 손실되지 않습니다. 어느 쪽이든 새로운 테이블 (TeacherId, AssignmentId)로 변환됩니다.

나중에 관리자가 사용할 수있는 항목을 관리자에게 할당 할 수 있다고 결정할 경우. 내 의견으로는이 분야는 새로운 계급의 가치가 없다는 것 또한 데이터베이스에서 복잡해질 것입니다.

+0

처음에는 객체 모델의 일부로 그렇게하는 것이 논리적 이었기 때문에'Teacher'를 사용했습니다. 관계를 쉽게 설정할 수있었습니다. 선생님 모델 주변에는 많은 관계가 없으므로 처음 생각한 것보다 유용하지 않습니다. –

관련 문제