2016-06-19 2 views
1

나는 클래스, 학부모, 학생, 과목 및 교사와 같은 테이블로 구성된 데이터베이스로 간단한 ASP.Net 응용 프로그램을 만들었습니다.ASP.NET 사용자 로그인

교사와 학부모가 서명하는 두 개의 엔티티가이 애플리케이션과 상호 작용합니다.

제 질문은 AspNetIdentity와 함께 제공되는 AspNetUsers 테이블에 등록 할 때마다 새로운 사용자를 저장하는 대신 Teachers 테이블에서 교사를 연결하는 방법입니다.

일단 교사/학부모가 로그인하면 해당 교사/학부모와 관련된 세부 정보를 보여주고 싶습니다. 예를 들어 선생님이 로그인하면 나는 데이터베이스에서 가져온 모든 수업을 보여주고 싶습니다.

ASP.NET MVC에 익숙하므로 매우 명확한 내용을 묻는다면 사과 할 것입니다. 어떤 도움이라도 appritiated됩니다. 크리스의 제안이 ApplicationUser에서 상속 후, 그래서

UPDATE

좋아, 내 데이터베이스를 업데이트 관리 지금은 내 데이터베이스에 대한 다음과 같은 구조를 가지고있다.

Entity Data Model

는 지금은 부모교사 테이블이 어디에 정확히 내가 데이터베이스에서 해당 개체를 검색 할 방법들이 하나 개의 테이블 "AspNetUsers"모든 경우에 조금 혼란 스러워요. 업데이트 2

그래서 난 내 AccountController에이 코드 조각이

public AccountController() 
      : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()))) 
     { 
     } 

     public AccountController(UserManager<ApplicationUser> userManager) 
     { 
      UserManager = userManager; 
     } 

     public UserManager<ApplicationUser> UserManager { get; private set; } 

그리고 이것은 등록() 메소드는 모습입니다 같은 :

if (ModelState.IsValid) 
      { 
       var user = new ApplicationUser() { UserName = model.UserName, FirstName = model.FirstName, LastName = model.LastName }; 
       var result = await UserManager.CreateAsync(user, model.Password); 
       if (result.Succeeded) 
       { 
        var Teacher = new Teacher 
        { 
         UserName = model.UserName, 
         FirstName = model.FirstName, 
         LastName = model.LastName, 
        }; 

        // Add the Address properties: 
        user.UserName = model.UserName; 
        user.FirstName = model.FirstName; 
        user.LastName = model.LastName; 

        var roleStore = new RoleStore<IdentityRole>(new ApplicationDbContext()); 
        var roleManager = new RoleManager<IdentityRole>(roleStore); 
        await roleManager.CreateAsync(new IdentityRole("Teacher")); 

        await UserManager.AddToRoleAsync(user.Id, "Teacher"); 

        await SignInAsync(user, isPersistent: false); 
        return RedirectToAction("Index", "Home"); 
       } 

다스 려에 Chris는 새로운 사용자가 새로운 교사로 등록 할 때 ApplicationUserManager의 인스턴스를 어떻게 설정합니까?

+0

여기에 바보 같은 질문이 없습니다. 당신은 아주 좋은 질문을했습니다. – RBT

답변

0

AspNetIdentity를 사용하고 있으므로 AspNetIdentity를 실제로 활용하려면 저장 메커니즘을 약간 변경해야합니다. 간단한 것은 인증을 요구하거나 로그인 과정을 거쳐야하는 모든 엔티티 (Teacher/Parent)가 AspNetusd 테이블에 저장되어 클레임을 생성하는 AspNetIdnetity 인증 프로세스의 기본 메커니즘을 활용해야한다는 것입니다. AspNetIdentity의 기본 테이블 대신 사용자 정의 테이블에 사용자 정보 (인증 대상)를 저장하면 추적 할 메커니즘이 없습니다.

이 응용 프로그램과 상호 작용하는 두 개의 엔티티가 교사 및 학부모가됩니다.

교사와 부모는 AspNetUsers 테이블에 저장하고 AspNetIdentity의 인증 절차 후 주장으로 그들을 얻을 완벽한 의미가 있습니다 이름, 성, 휴대폰 번호 등과 같은 일반적인 특성을 많이해야합니다.

예를 들어

I에서 교사 로그는 모든 클래스를 보여주고 싶은 그/그녀는 내가 당신이 AspNetUser 's의 외부 키를해야합니다이를 위해 데이터베이스

에서 검색하는 가르친다 표

+0

답장을 보내 주셔서 감사합니다. 내가 어떻게 교사가 유형의 사용자와 각 과목을 assisiate해야 AspNetUsers 테이블에서 내 과목 테이블에 외래 키를 추가합니다. – Ayan

0

ID가 존재하는 이유 중 하나는 인증으로 확장 성을 가능하게하는 것입니다. 그렇지 않으면 우리 모두가 이전 ASP.NET 멤버쉽을 사용할 수 있습니다. 그래서, 그것을 사용하십시오. 이를 처리하는 가장 좋은 방법은 상속을 통한 것입니다. 귀하의 기본 "사용자는"ApplicationUser 될 것이며, "사용자"의 모든 하위 유형이 상속해야합니다

public class Teacher : ApplicationUser 

public class Parent : ApplicationUser 

이 발생합니다 기본적으로 단일 테이블 상속에 경우 모든 하위 유형의 모든 속성 ApplicationUser의 데이터는 모두 동일한 테이블에 저장됩니다 (기본값 : AspNetUsers). Discriminator 열이 추가되어 데이터베이스에서 레코드를 쿼리 할 때 인스턴스화해야하는 Entity Framework 클래스의 값 (예 : Teacher, Parent 또는 ApplicationUser)이 포함됩니다. 대부분의 경우이 기능은 훌륭합니다. 알고 있어야하는 유일한 점은 부속 유형의 모든 특성이 하나의 테이블에 들어가기 때.에 해당 유형에 널 (null) 입력이 불가능한 특성을 가질 수 없기 때.입니다. 예를 들어 Teacher에 데이터베이스 수준에서 시행 할 속성이 항상 값이있는 경우 Parent 또는 ApplicationUser에 값을 제공 할 수단이 없기 때문에 값을 가질 수 없습니다. 그러나 데이터베이스가 아닌 UI 수준에서 항상 값을 요구할 수 있습니다.

완전히 받아 들일 수없는 경우 대신 테이블 당 유형 상속을 사용할 수 있습니다. 이 전략을 사용하면 AspNetUsers 테이블 외에 ParentTeacher에 대한 별도의 테이블이 생성됩니다. 그러나 해당 유형에 고유 한 특성 만이 해당 테이블에 적용됩니다. ApplicationUser의 모든 속성은 AspNetUsers에 머물 것이고 AspNetUsersTeacherParent 사이에 일대일이 각각 추가됩니다. 즉, Teacher을 검색하려면 Entity Framework에서 AspNetUsers으로 조인해야하며 조인은 단일 테이블을 쿼리하는 것보다 항상 효율적이지 않습니다. 그러나이 방법을 사용하면 데이터베이스 수준에서 하위 유형 속성에 NOT NULL을 적용하도록 설정할 수 있으므로 트레이드 오프가됩니다.

UPDATE

정체성은 더 이상 제네릭 UserManager<TUser>의 구현을 발판. TUser을 명시 적으로 ApplicationUser으로 지정합니다. 즉, 던져진 모든 하위 유형이 그로 다운 캐스팅됩니다. 경우,

public class ApplicationUserManager<TUser> : UserManager<TUser> 
    where TUser : ApplicationUser 

을 이제, ApplicationUserManager<Teacher>의 인스턴스를 새 수 있으며, 그것은 분명히 Teacher 경우, 쿼리에만 Teacher 경우 등을 저장합니다 : 내가 이야기하고있는 것은 일반적인 유지되도록 단지이 클래스를 변화 일반적으로 모든 사용자가 명으로 작업해야하는 경우이를 위해 ApplicationUserManager<ApplicationUser>의 인스턴스를 새로 만들어야합니다.

+0

크리스에게 시간을내어 주셔서 감사합니다.ASP.NET에서 단일 테이블 상속의 좋은 예가 있습니까?이 시나리오는 내 senario와 관련이 있습니다. – Ayan

+0

당신이 뭘 찾고 있는지 잘 모르겠습니다. 꽤 간단합니다 : 타입과 모든 서브 타입의 모든 프로퍼티는 하나의 테이블에 저장되고, 저장된 정확한 클래스를 식별하는 추가의 'Discriminator' 컬럼이 있습니다. 그것은 또한 기본 방법론이기 때문에, 당신이 실제로 그것을 보길 원한다면, 다른 것에서 하나의 엔티티를 상속 받고 DB 레벨에서 일어나는 일을 살펴보십시오. –

+0

좋아, 그럼 천천히 내 머리를 둥글게하고있어. 정체성 2.0 그러나 나는 아직도 조금 혼란 스럽다. 따라서 사용자가 등록 단추를 클릭 할 때 새 Teacher 개체를 만들면 교사가 포함 된 Discriminator 열을 사용하여 AspNetUsers 테이블에 새 레코드가 추가되어이 사용자가 교사 대상? 내가 맞습니까? – Ayan

관련 문제