Модель базы данных для пользователей с несколькими возможностями

В другом вопросе я объясняю свою цель - создать 2 разных типа пользователей с разными возможностями в мой веб-сайт ASP.Net MVC 5. Интересно, как я смогу изменить свои текущие модели баз данных, чтобы они содержали связанную информацию в зависимости от их типа. Мои текущие модели следующие:

public class User : IUser
{
    public User()
        : this(String.Empty)
    {
    }

    public User(string userName)
    {
        UserName = userName;
        Id = Guid.NewGuid().ToString();
    }

    [Key]
    public string Id { get; set; }

    [Required]
    public string UserName { get; set; }

    [Required]
    public string FirstName { get; set; }

    [Required]
    public string LastName { get; set; }

    public string Phone { get; set; }
    public string MobilePhone { get; set; }

    [Required]
    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }

    public virtual IList<UserAddress> Addresses { get; set; }
}

public class Restaurant
{
    [Key]
    public int ID { get; set; }

    [Required]
    public string Name { get; set; }

    public virtual IList<RestaurantAddress> Addresses { get; set; }

    public virtual IList<RestaurantFood> Menu { get; set; }

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

    [DataType(DataType.Url)]
    public string Website { get; set; }

    [DataType(DataType.PhoneNumber)]
    public string Phone { get; set; }

    [DataType(DataType.PhoneNumber)]
    public string Fax { get; set; }

    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }

    public int Seats { get; set; }

    public double AverageRating { get; set; }
    public double AveragePrice { get; set; }
}

Одно из решений, которое приходит мне на ум, состоит в том, чтобы переместить дополнительную информацию класса User в другой класс и сохранить внешний ключ для связанной модели в базовом классе информации о пользователе. Что-то типа:

public class User : IUser
{
    public User()
        : this(String.Empty)
    {
    }

    public User(string userName)
    {
        UserName = userName;
        Id = Guid.NewGuid().ToString();
    }

    [Key]
    public string Id { get; set; }

    [Required]
    public string UserName { get; set; }

    public virtual ExtendedUser NormalUserInfo { get; set; }
    public virtual Restaurant RestaurantInfo { get; set; }
}

public class ExtendedUser
{
    [Required]
    public string FirstName { get; set; }

    [Required]
    public string LastName { get; set; }

    public string Phone { get; set; }
    public string MobilePhone { get; set; }

    [Required]
    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }

    public virtual IList<UserAddress> Addresses { get; set; }
}

public class Restaurant
{
    [Key]
    public int ID { get; set; }

    [Required]
    public string Name { get; set; }

    public virtual IList<RestaurantAddress> Addresses { get; set; }

    public virtual IList<RestaurantFood> Menu { get; set; }

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

    [DataType(DataType.Url)]
    public string Website { get; set; }

    [DataType(DataType.PhoneNumber)]
    public string Phone { get; set; }

    [DataType(DataType.PhoneNumber)]
    public string Fax { get; set; }

    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }

    public int Seats { get; set; }

    public double AverageRating { get; set; }
    public double AveragePrice { get; set; }
}

и в контроллере:

    User user = BuildUser();
    ExtendedUser normal = BuildNormalUser();
    Restaurant rest = BuildRestaurant();
    if (model.Type == UserType.NormalUser)
        user.NormalUserInfo = normal;
    else
        user.RestaurantInfo = normal;

Однако я не уверен, что это правильно.


person Alireza Noori    schedule 17.08.2013    source источник
comment
Почему вы просто добавляете внешний ключ к своему пользовательскому объекту для представления типа пользователя...? Покажи мне более наглядный пример аима, может я тебе помогу...   -  person Amin Saqi    schedule 21.08.2013
comment
Думаю, я нашел ответ. Я думаю, что я должен добавить внешний ключ к расширенным типам. Верно?   -  person Alireza Noori    schedule 21.08.2013
comment
Тоже может быть. В эти дни есть несколько способов достичь своей цели!   -  person Amin Saqi    schedule 22.08.2013