Я новичок в 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
и никогда не помещать в нее данные, но это кажется глупым.
Есть лучший способ сделать это?
Поскольку вы сначала используете базу данных, вам необходимо также реорганизовать свою базу данных, чтобы ввести базовый класс в базу данных.
Ниже приведен пример схемы с таблицей 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
)
Затем вы создаете модель сущности из базы данных. По умолчанию сгенерированная диаграмма покажет вам отношение к нулю или одному.
Затем сделайте следующее на диаграмме
Сгенерированный DbContext
будет иметь только один DbSet
типа Person.
public virtual DbSet<Person> People { get; set; }
Больше
Я создал интерфейс для базы, а затем каждый из объектов реализовал этот интерфейс.
public interface IEvent
{
...
}
public partial class ScheduledEvent : IEvent
{
...
}
public partial class RealizedEvent : IEvent
{
...
}
Затем это позволяет мне создавать коллекцию событий. Я могу получить доступ ко всем общим свойствам и методам IEvent и проверить тип, когда это необходимо.