Иерархии классов и интерфейсов в Entity Framework? - PullRequest
11 голосов
/ 09 декабря 2008

У меня есть два связанных класса, которые имеют общий интерфейс и оба хранятся в одной и той же базовой таблице базы данных. Тем не менее, 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; }
}

1 Ответ

14 голосов
/ 09 декабря 2008

Различаются ли эти данные? то есть AccountType определяет, какой это тип? Если так:

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

Тип учетной записи должен полностью исчезнуть из объекта «Учетная запись» (если нет, удалите его). Чтобы получить только записи UserAccount, вы используете

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

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

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

и т.д.

Разумное прохождение здесь .

...