2014-09-02 3 views
2

MVC5 앱을 만들고 있는데 이미 ASP.NET ID를 사용하여 사용자를 만들고 있습니다. 그래서, 나는 이미 AspNetUsers 테이블을 가지고 있으며, 사용자가 등록 할 때마다 엔트리를 얻습니다. 또한 수동으로 지정하는 관리자 역할이 있습니다. 등록 된 사용자는 관리자입니다. 반면에, 나는 또한 비즈니스를 등록해야하며 일반 사용자와 마찬가지로 로그인, 등록 및 일부 작업을 수행 할 수 있습니다. 요점은 일반 사용자와의 유사성 및 다른 필드를 모두 갖게된다는 것입니다. 예를 들어 전자 메일 주소, 암호 (일반 사용자처럼 해시하고 싶음), 전자 메일 확인, 고유 ID 등도 갖게됩니다. 그러나 주소, zip , 국가, 카테고리 등이 포함됩니다. 어떻게 이것을 MVC에서 얻을 수 있습니까?MVC5에서 두 가지 유형의 사용자를 만들려면 어떻게해야합니까?

ApplicationUser 클래스처럼해야합니까?

public class ApplicationUser : IdentityUser 

내 비즈니스 모델을 IdendityUser로부터 상속해야합니까? 그렇다면 내 모델은 IdentityUser의 어떤 필드를 사용하고 어떤 필드를 사용해야하는지 어떻게 알 수 있습니까? 여기

내 현재의 비즈니스 모델 :
public class Business 
{ 
    public int BusinessID { get; set; } 

    public string BusinessName { get; set; } 

    [ForeignKey("Category")] 
    public int CategoryID { get; set; } 

    public virtual Category Category { get; set; } 

    [ForeignKey("Subcategory")] 
    public int SubcategoryID { get; set; } 

    public virtual Subcategory Subcategory { get; set; } 

    public string BusinessAddress { get; set; } 

    public string BusinessZip { get; set; } 

    public string BusinessPhone { get; set; } 

    public string BusinessDescription { get; set; } 

    public string Facebook { get; set; } 

    public string Twitter { get; set; } 

    public byte[] ImageData { get; set; } 

    public string ImageMimeType { get; set; } 

    [Range(0.0, 5.0)] 
    public double BusinessRating { get; set; } 

    public virtual ICollection<Review> Reviews { get; set; } 
} 

그래서, 떨어져 그 분야에서, 내 표는 AspNetUsers 유사 물건, 이메일과 같은 EmailConfirmed, PasswordHash, SecurityStamp을 포함 할

편집 :

비즈니스 모델의 일부 필드는 필수 사항입니다. 또한 아래에서 내 ApplicationUser 클래스를 찾을 수 있습니다.

public class ApplicationUser : IdentityUser 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) 
    { 
     // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType 
     var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); 
     // Add custom user claims here 
     return userIdentity; 
    } 
} 

답변

2

를 사용하여 간단한 상속 :

public class Business : ApplicationUser 
{ 
    ... 
} 

당신은 그것을 행 (Business 또는 ApplicationUser)에 대해 초기화해야하는 클래스 엔티티 프레임 워크 ID를 도움이됩니다 AspNetUsers 테이블에 Discriminator 열을하게 될 겁니다 . 그런 다음 중 하나를 그냥 일반 조회 할 수 있습니다 또는 당신은 단지 하나 개의 특정 유형 또는 다른를 원한다면, 당신은 OfType<T>를 사용할 수 있습니다

var businessUsers = db.Users.OfType<Business>(); 

참고 : 기본적으로 엔티티 프레임 워크는 Discriminator 열이있는 단일 테이블과 간단한 상속을 처리합니다. 대부분의 경우이 방법은 정상적으로 작동하지만 기본 클래스의 하위 클래스에 추가하는 모든 속성은 null을 허용해야합니다. 데이터베이스 수준에서는 BusinessDateTime과 같은 것을 요구할 수 없습니다. 그 이유는이 속성이없는 ApplicationUser을 저장할 수 없기 때문입니다. 그러나 이는 데이터베이스 수준에서만 문제가됩니다. 프런트 엔드 관점에서 뷰 모델을 사용하여 Business의 특정 속성을 계속 만들 수 있습니다.

+1

그런 식으로 사용하면 자동으로 다른 입력란이 표시됩니까? AspNetUsers에서 다른 모든 필드를 얻고 싶지는 않지만 그 중 일부 필드 만 가져오고 싶습니다. – tett

+0

예, 이것은 OOP 101입니다. 하위 클래스는 수퍼 클래스의 모든 속성을가집니다. 그러나, 다시 한번 말하지만, 실제로 거기에 있기 때문에, 당신이 실제로 그것을 사용해야한다는 것을 의미하지는 않습니다. 이것이 왜 우수한 애플리케이션 아키텍처에서 뷰 모델이 중요한지에 대한 이유입니다.특정 속성이 실제로 존재하지 않게하려면'BusinessUser : ApplicationUser' 및'NormalUser : ApplicationUser'와 같은 클래스를 만드는 것을 고려할 수 있습니다.이 클래스는 두 유형의 사용자가 공유하는 가장 기본적인 속성 집합 만 넣을 수 있습니다 'ApplicationUser'에 저장하지만, 그들은 여전히 ​​모두 같은 테이블에 저장된다는 것을 기억하십시오. –

+0

빠른 질문으로 Business : ApplicationUser 및 User : ApplicationUser라는 두 클래스를 만든 후 IdentityModels 파일에 다음과 같은 내용이 있습니다. public System.Data.Entity.DbSet Businesses {get ; 세트; } 및 User 모델에 대해 동일한 값을 반환합니다. 그런 다음 마이 그 레이션을 만들었지 만 Update-Database를 수행 할 때 "테이블 'aspnetusers'가 이미 있음"이라는 오류 메시지가 나타납니다. 이 문제를 어떻게 해결할 수 있습니까? 내 데이터베이스의 모든 테이블을 먼저 삭제 한 다음 update-database를 수행해야합니까? – tett

관련 문제