2014-09-03 3 views
1

Я новичок в EF и до сих пор работаю над кривой обучения.Использование письменного класса в качестве базового типа для объекта EF6

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

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

Я попытался

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

public partial class ScheduledEvent : BaseEvent 
{ ... } 

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

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

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

ответ

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 от пользователя и контакта
  • Открыть таблицу сопоставления для пользователя и контакта, затем сопоставить столбец идентификатора с идентификатором
  • Сохранить

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

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

Более

+0

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

0

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

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

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

Смежные вопросы