C# 将编写的类用作EF6实体的基类型

C# 将编写的类用作EF6实体的基类型,c#,entity-framework,C#,Entity Framework,我是EF的新手,仍在努力学习 我有两个表ScheduledEvent和RealizedEvent。显然,这两个事件具有相似的属性,但它们也有一些不同的属性。计划的事件将生成已实现的事件记录,但不必计划已实现的事件。为了简单起见,我在数据库中使用了两个表 在C#中,我希望有一个基本事件类,这两个实体都继承它 我试过了 public class BaseEvent { public virtual int ID { get; set; } ... /*All overlapping

我是EF的新手,仍在努力学习

我有两个表ScheduledEvent和RealizedEvent。显然,这两个事件具有相似的属性,但它们也有一些不同的属性。计划的事件将生成已实现的事件记录,但不必计划已实现的事件。为了简单起见,我在数据库中使用了两个表

在C#中,我希望有一个基本事件类,这两个实体都继承它

我试过了

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

public partial class ScheduledEvent : BaseEvent
{ ... }
这会生成警告,因为EF自动生成的类不会覆盖方法和属性

我可以在.edmx窗口中看到,在该窗口中我可以为实体指定
基本类型
,但它不允许我选择用户编写的类。我想我可以定义一个具有重叠字段的表,在
基本类型中指定它,并且从不将数据放入其中,但这似乎很愚蠢


有更好的方法吗?

因为您首先使用数据库,所以还需要重构数据库,以便在数据库中引入基类

下面是一个模式示例,其中包含
Person
User
Contact
表<代码>人员
表表示实体模型中的基类

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
)
然后从数据库生成实体模型。默认情况下,生成的图表将显示一对零或一关系

然后在图中执行以下操作

  • 删除一对零或一关系关联
  • 将某人标记为抽象人物
  • 将用户和联系人的基本类型设置为Person
  • 从用户和联系人中删除Id属性
  • 打开用户和联系人的表映射,然后将Id列映射到Id属性
  • 拯救
生成的
DbContext
将只有一个Person类型的
DbSet

public virtual DbSet<Person> People { get; set; }
公共虚拟数据库集人物{get;set;}
更多


我为基础创建了一个接口,然后让每个实体实现该接口

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

这样我就可以构建一个事件集合。我可以访问IEvent的所有共享属性和方法,并在需要时检查类型。

谢谢您的回答。这真的帮助我了解了更多,并推动了我的前进。我最终使用了一个接口,因此不必重构数据库。我理解,这不是维护性的最佳解决方案。