我是EF的新手,我仍在努力学习。
我有2个表ScheduledEvent和RealizedEvent。显然,这些都是具有相似属性的事件,但它们也具有一些不同的属性。预定事件将生成已实现的事件记录,但不必安排已实现的事件。为简单起见,我在数据库中使用了2个表。
在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
中指定,并且永远不会在其中放入数据,但这看起来很愚蠢。
有更好的方法吗?
答案 0 :(得分: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
)
然后从数据库生成实体模型。默认情况下,生成的图表将显示一对一或零关系。
然后在图中执行以下操作
生成的DbContext
只有一个DbSet
类型的人。
public virtual DbSet<Person> People { get; set; }
更多
答案 1 :(得分:0)
我为基础创建了一个接口,然后让每个实体实现该接口。
public interface IEvent
{
...
}
public partial class ScheduledEvent : IEvent
{
...
}
public partial class RealizedEvent : IEvent
{
...
}
然后让我构建一个事件集合。我可以访问IEvent的所有共享属性和方法,并在需要时检查类型。