EF Code First 4.1: «Множественное наследование» (Is A) Вопрос - PullRequest
0 голосов
/ 18 мая 2011

Я пытаюсь смоделировать своего рода отношения «множественного наследования» с 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.

1 Ответ

1 голос
/ 18 мая 2011

Да, вы можете сделать это так, как вы описали в первых двух примерах кода.

Я думаю, вам просто нужно определить отображение, которое вы захотите сделать в вашей OnModelCreating функции вашего DataContext в дополнение к правильной настройке ваших классов.Как вы это сделаете, зависит от того, какую схему сопоставления вы используете.Я использовал Table-Per-Type (TPT) в своем последнем проекте, поэтому у меня было что-то вроде этого:

modelBuilder.Entity<User>().ToTable("Users");
modelBuilder.Entity<Shopper>().ToTable("Shoppers");
modelBuilder.Entity<OtherUser>().ToTable("OtherUsers");

Дайте мне знать, если это не сработает для вас, и я посмотрю, чтоЯ могу сделать.

Редактировать:

Увидев ваше разъяснение ниже, я не могу придумать, как это сделать.Вы должны хранить каждый объект отдельно (если EF рассматривает покупателя как покупателя, а не покупателя и пользователя), даже если они совместно используют общие данные.Это может привести к несоответствию данных (например, если Shopper обновил свое LastName, а пользователь - нет).Я думаю, что вам может быть лучше пойти с чем-то вроде:

public class User
{
    public virtual Guid ID { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual ShopperInfo { get; set; }
}

public class ShopperInfo
{
    public virtual ICollection<Order> Orders { get; set; }
}

, а затем, когда вам нужно рассматривать пользователя как покупателя, вы просто получаете доступ к ShopperInfo (и, если его там нет, вы создаете его).EF сможет правильно настроить его для вас, без проблем.

Хотя, если у вас будет много типов пользователей, это может стать громоздким.Только предложение - я думаю, что это немного чище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...