Использование письменного класса в качестве базового типа для сущности EF6

1

Я новичок в EF и все еще работаю над кривой обучения.

У меня есть 2 таблицы ScheduledEvent и RealizedEvent. Очевидно, что это оба события со сходными свойствами, но у них также есть некоторые разные свойства. Планируемое событие генерирует реализованную запись события, но запланированное событие не должно быть запланировано. Для простоты я пошел с двумя таблицами в базе данных.

В С# я хотел бы иметь базовый класс событий, который оба эти объекта наследуют.

я пробовал

public class BaseEvent
{
    public virtual int ID { get; set; }
    ... /*All overlapping properties*/
}

public partial class ScheduledEvent : BaseEvent
{ ... }

Это генерирует предупреждения, потому что автогенерируемые классы EF не override методы и свойства.

Я могу видеть в окне.edmx, где я могу указать Base Type для объектов, но он не позволяет мне выбирать класс, написанный пользователем. Думаю, я мог бы определить таблицу с перекрывающимися полями, указать ее в Base Type и никогда не помещать в нее данные, но это кажется глупым.

Есть лучший способ сделать это?

Теги:
entity-framework

2 ответа

1
Лучший ответ

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

Ниже приведен пример схемы с таблицей Person, User и Contact. Таблица Person представляет базовый класс в модели сущности.

create table [Person] (
   Id int identity primary key,
   Code nvarchar(max),
   FirstName nvarchar(max),
   LastName nvarchar(max)
   /* other overlapping columns */
)
create table [User] (
   Id int primary key, /* PK but also FK */
   UserName nvarchar(max),
   Password nvarchar(max),   
   foreign key(Id) references [Person](Id) on delete cascade
)
create table [Contact] (
   Id int primary key, /* PK but also FK */
   City nvarchar(max),
   PostalCode nvarchar(max),
   foreign key(Id) references [Person](Id) on delete cascade
)

Затем вы создаете модель сущности из базы данных. По умолчанию сгенерированная диаграмма покажет вам отношение к нулю или одному.

Затем сделайте следующее на диаграмме

  • Удалите связь с ассоциацией отношений нуля или одного
  • Отметить как
  • Установить пользователя и контакт BaseType с человеком
  • Удалить свойство Id от пользователя и контакта
  • Открыть табличное сопоставление для пользователя и контакта, а затем сопоставить столбец идентификатора с идентификатором Id
  • Сохранить

Сгенерированный DbContext будет иметь только один DbSet типа Person.

public virtual DbSet<Person> People { get; set; }

Больше

  • 0
    Спасибо за ответ. Это действительно помогло мне понять больше и подтолкнуть меня вверх по кривой. В итоге я использовал интерфейс, поэтому мне не пришлось проводить рефакторинг базы данных. Я понимаю, что это не лучшее решение для ремонтопригодности.
0

Я создал интерфейс для базы, а затем каждый из объектов реализовал этот интерфейс.

public interface IEvent
{
   ...
}
public partial class ScheduledEvent : IEvent
{
   ...
}
public partial class RealizedEvent : IEvent
{
   ...
}

Затем это позволяет мне создавать коллекцию событий. Я могу получить доступ ко всем общим свойствам и методам IEvent и проверить тип, когда это необходимо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню