Я пытаюсь смоделировать своего рода отношения «множественного наследования» с EF 4.1 Code First. Вот пример того, что я пытаюсь сделать.
Допустим, я пытаюсь смоделировать способ взаимодействия пользователя с моим приложением с помощью объекта "Пользователь". Этот базовый класс используется для описания текущего пользователя, когда он ничего не делает конкретно (например, посещает домашнюю страницу). Это может выглядеть так:
public class User
{
public Guid ID { get; set; } // Just use the forms authentication user ID
public string FirstName { get; set; }
public string LastName { get; set; }
}
Теперь, если я хочу создать представление того же пользователя, но в другой части сайта, скажем, как покупатель, это может выглядеть так:
public class Shopper : User
{
public virtual ICollection<Orders> Orders { get; set; }
}
И так далее, и так далее. Когда я иду, чтобы вставить Shopper с уже существующей записью User, он выдает исключение, потому что PK уже занесен в таблицу User.
Есть ли способ смоделировать эти (IsA) отношения с EF Code First? Или я застряну с чем-то вроде этого?
public class Shopper
{
public Guid UserID { get; set; }
public virtual User User { get; set; }
public virtual ICollection<Order> Orders { get; set; }
public string FirstName
{
get { return User.FirstName; }
set { User.FirstName = value; }
}
// yada, yada, yada...
}
Я бы хотел придерживаться Code First и смоделировать отношения прямо в моем DbContext, но я не могу понять, как сделать что-то подобное. Спасибо!
EDIT:
Итак, я пытаюсь сделать что-то вроде этого:
public void SomeMethod ()
{
var UserID = Guid.NewGuid ();
var MyUser = new User () { ID = UserID };
SaveUserToDatabase (MyUser);
var ShopperRepresentation = GetUserAsShopper (UserID);
// Do stuff.
}
В основном, как использование объектно-ориентированных ролей, наверное. Я хочу использовать один и тот же PK для каждого представления этого пользователя, но хранить всю их основную информацию в базовом классе под названием User. Я знаю, что это возможно, если я напишу свой собственный SQL, конечно, но я хочу посмотреть, сможет ли это сделать и EF Code First.