2

Я использую ASP.NET Identity 2.0 в MVC приложении и есть таблица по умолчанию называется AspNetUsers для того, чтобы сохранить пользовательские данные с колонками ниже:Использование пользовательских свойств для AspNetUsers таблицы в ASP.NET Идентичность

AspNetUsers:

Id 
Email 
EmailConfirmed 
PasswordHash 
... etc 

Я знаю, что я могу добавить пользовательские свойства объекта как Name, Surname и т.д. в этой AspNetUsers таблице. Однако в моем проекте есть 2 типа пользователей: Student и Professor. Поэтому мне нужно использовать различные свойства, как показано ниже:

Студент:

Id 
Name 
Surname 
Email 
StudentNumber 
Department 

Профессор:

Id 
Name 
Email 
Surname 
Profession 
RoomNumber 

На данный момент у меня есть проблемы при объединении этих структур и I не знаю, как их сочетать. Студенты и преподаватели хранятся в таблице AspNetUsers, и я думаю, что нет необходимости определять те же данные, что и Email, на разных таблицах, и лучше использовать только разные свойства в таблицах Student и Professor как StudentNumber, RoomNumber и т. Д. Когда логин пользователя в систему, я думаю, сначала использовать таблицу AspNetUsers, а затем получить подробные данные для текущего пользователя из таблицы Student или Professor. Есть ли лучший подход для этой ситуации? Я думаю, что ASP.NET Identity обычно используется, и многие люди должны хранить различные свойства детали для разных типов пользователей. Любая помощь будет оценена по достоинству.

+0

Что случилось с подходом вы описываете? Я делаю это сам, и он отлично работает –

+0

Я просто хотел быть уверенным, есть ли лучший подход и хороший подход. Если у вас есть идея, не могли бы вы взглянуть на 3 вопроса ниже и прокомментировать свое мнение? Благодарю. –

ответ

2

Вот еще одно возможное решение, хотя вам решать, подходит ли оно для ваших нужд. Вы можете использовать таблицу для иерархии (TPH) для своей модели. Сначала сделайте ваш пользовательский класс абстрактный и поместить все общие свойства там:

public abstract class ApplicationUser : IdentityUser 
{ 
    //snip 

    //Common properties 
    public string Name { get; set; } 
    public string Surname { get; set; } 
} 

Теперь создавать различные классы типов пользователей и наследовать от базового класса:

public class StudentUser : ApplicationUser 
{ 
    public string StudentNumber { get; set; } 
} 

public class ProfessorUser : ApplicationUser 
{ 
    public string Profession { get; set; } 
} 
+0

На самом деле это очень хороший подход, но, поскольку я использую EF Code First, я не уверен, как его использовать. Например, когда я создаю запись Student с использованием объекта StudentUser и добавляю Name, SUrname, EF добавит имя, фамилию в таблицу ApplicationUser, добавив StudentNumber в StudentUser? Есть идеи? –

+0

Да, все свойства будут находиться в одной и той же таблице пользователей, включая столбец с именем «Дискриминатор», который будет иметь такое значение, как «StudentUser», чтобы EF определял тип. – DavidG

+0

Кроме того, это код только так, по определению, кодовый. – DavidG

2

Переместить общие свойства в таблицу AspNetUsers, то есть ваше имя, адрес электронной почты, фамилию. Точно так же функциональность логина входа будет одинаковой для учеников и учителей, так же как и эти таблицы. Для информации, характерной для преподавателя или профессора , это, где вам нужны ваши конкретные таблицы. Например.

public class AspNetUser 
{ 
    // Normal properties 

    public virtual Professor Professor { get; set; } 

    public virtual Student Student { get; set; } 
} 

public class Professor 
{ 
    [Key] 
    public int Id { get; set; } 

    public virtual AspNetUser User { get; set; } // This is where you will be able to retrieve their name, email etc 

    public string Profession { get; set; } 

    // Any other properties specific to a Professor 
} 
+0

Большое спасибо. В этом случае я думаю, что нет никаких проблем с моим подходом. С другой стороны, я задаюсь этим вопросом, и я был бы рад, если бы вы разъяснили мне, что они упираются в них >>> –

+0

** 1) ** Я также добавляю свойство Type в таблицу AspNetUser, чтобы определить, что если пользователь Student или Профессор.Затем, создавая нового пользователя, я добавляю новую запись в таблицу AspNetUser и добавляю другую запись в таблицу Student или Professor с пользовательскими свойствами, это правда? ** 2) ** Если первое верно, вы предлагаете использовать транзакцию в EF? ** 3) ** При входе пользователя в систему я смотрю на тип во время аутентификации и получаю подробные данные из соответствующей таблицы. Это правда? Спасибо ... –

+0

@binary К сожалению, это все отдельные вопросы, поэтому вы можете попросить новые. Однако не создавайте свойство Type. В вашей таблице «AspNetUsers» у вас будет «публичный виртуальный профессор», а другой - «Студент», а затем, если он равен нулю, вы узнаете, какой он. – ediblecode