Подтвердить что ты не робот

Иерархии классов и интерфейсов в Entity Framework?

У меня есть два связанных класса, которые имеют общий интерфейс и оба хранятся в одной и той же базовой таблице базы данных. Тем не менее, Entity Framework генерирует один общий класс, где мне действительно нужны два разных класса. Как это разрешить? Лучше ли использовать базовый класс, а не интерфейс? Как изменить модель EF, чтобы обеспечить отображение двух классов по одной таблице?

Изменить: свойство AccountType определяет тип класса; пользователя или группы.

Простой код:

public interface IAccount
{
    string Name { get; set; }
    AccountType AccountType { get; set; }
}

public class GroupAccount : IAccount
{
    public string Name { get; set; }
    public GroupType GroupType { get; set; }
    public AccountType AccountType { get; set; }
}

public class UserAccount : IAccount
{
    public string Username { get; set; }
    public string Password { get; set; }
    public string Name { get; set; }
    public AccountType AccountType { get; set; }
}
4b9b3361

Ответ 1

Являются ли эти данные дискриминированными? то есть тип AccountType определяет, какой тип он есть? Если да:

  • EF должен создать объект Account из хранилища
  • вы создаете 2 подкласса (UserAccount и GroupAccount)
  • в сопоставлении для Учетной записи, укажите предикат "добавить условие",
    • сопоставьте его с UserAccount, где поле AccountType (storage) равно 1 (или что-то еще)
    • сопоставьте его с GroupAccount, где поле AccountType (storage) равно 2 (или что-то еще)

Затем тип учетной записи должен полностью исчезнуть из объекта Учетная запись (unmap it if not). Чтобы получить только записи UserAccount, вы используете

 .Accounts.OfType<UserAccount>()...

Класс учетной записи должен быть абстрактным в этой модели. Материал интерфейса можно добавить через частичный класс, то есть в отдельный файл, определить:

partial class Account : IAccount {
   // extra code here
}

и т.д.

Разумное пошаговое руководство здесь.