2017-02-10 85 views
1

在我的項目中,Admin添加了教師,然後每個教師添加他的學生。當他們被添加時,他們會收到一封電子郵件,要求他們完成註冊。我可以在ASP.NET MVC中創建多個身份表嗎?

我在我的項目中的以下類:

1-Student類

Student: int id, int Registry number, int grade, string password, string email, string name 

2,教師班級:

Instructor: int id, string name , string email , string password 

3,我的數據庫環境:

public class InstructorContext:DbContext 
{ 
    public InstructorContext() : base("InstructorContext") 
    { 
    } 

    public DbSet<Instructor> Instructors { get; set; } 
    public DbSet<Student> Students { get; set; }} 

當我們呃入門,我必須確定他是管理員還是導師還是學生。我必須使用基於角色的身份驗證嗎?我已經有2個不同的角色分開的類。他們是否有可能從IdentityUser繼承?

回答

2

不,你不能有多個用戶表與身份,至少不是在技術上。 Identity(角色,聲明,登錄等)的所有其他核心組件都使用外鍵設置爲一個用戶表。

對於你的場景,你應該使用繼承。例如:

public class ApplicationUser : IdentityUser 

public class Instructor : ApplicationUser 

public class Student : ApplicationUser 

默認情況下,實體框架將創建一個表ApplicationUserDiscriminator列添加到它。此列將具有三個可能值之一:「ApplicationUser」,「教師」和「學生」。當EF從該表中讀取時,它將使用該列來實例化正確的類。這就是所謂的單表繼承(STI)或者作爲每級表(TPH)。這種方法的主要缺點是所有類的所有屬性都必須在同一個表中表示。例如,如果要創建新的Student,則Instructor的列仍將保留在記錄中,只有這些值爲空值或默認值。這也意味着您無法在數據庫級別強制執行類似Instructor之類的屬性,因爲這會阻止保存無法提供這些值的ApplicationUserStudent實例。換句話說,派生類的所有屬性都必須爲空。但是,您始終可以使用視圖模型來強制執行類似於表單目的所需的屬性。

如果你真的想要分開的表,你可以通過改變繼承策略到所謂的按類型(TPT)來實現這個目標。這將做的是保持表ApplicationUser,但添加兩個額外的表,InstructorStudent各一個。然而,所有的核心屬性,外鍵等將在ApplicationUser的表格中,因爲那是定義它們的地方。 InstructorStudent的表格將僅容納在這些類別(如果有的話)上定義的屬性以及ApplicationUser的表格的外鍵。查詢時,EF將會進行連接以從所有這些表中獲取數據並使用適當的數據實例化適當的類。像這樣的一些純粹主義者更好地保持數據庫中的數據標準化。但是,由於連接的原因,在查詢方面它必然更重。

最後一句要謹慎,因爲這會讓人們不斷地處理與身份的繼承關係。UserManager類是一個通用類(UserManager<TUser>)。例如,AccountController中的默認實例是UserManager<ApplicationUser>的實例。因此,如果使用該實例,則查詢返回的所有用戶將爲ApplicationUser實例,而不管Discriminator列的值如何。要獲取Instructor實例,您需要實例化UserManager<Instructor>並將其用於與Instructor相關的查詢。

第一次創建用戶尤其如此。考慮以下幾點:

var user = new Instructor(); 
UserManager.Create(user); 

您可能認爲用戶將與「導師」的鑑別值被保存,但它實際上與「ApplicationUser」保存。這是因爲UserManager又是UserManager<ApplicationUser>的一個實例,並且您的Instructor正在上傳。再一次,只要你記得使用適當類型的UserManager<TUser>,你會沒事的。

+0

如果我只有1個管理員,我必須添加「管理員」類嗎?還是足以檢查電子郵件和密碼? – Comp23555

+0

不,我的意思是你*可以*,但「管理員」更通常被認爲是一個角色。區分的一個好方法是考慮重疊。如果像「講師」這樣的東西也可能是管理員(不管你是否真的會允許),那麼它可能更適合作爲一個角色。這樣,如果您需要,您*可以*使教師成爲管理員,而不會影響系統的其他部分。否則,你最終會得到類似'Instructor','Admin'和'AdminInstructor'這樣的東西,這顯然很快就會變得混亂, –

+0

另外,通過使用角色,你可以添加類似'[Authorize(Roles =「Admin 「)]'給控制器/僅限管理員的操作。作爲另一種派生類型,您需要創建一些自定義來確定訪問級別。 –

相關問題