使用写入的类作为EF6实体的基本类型

时间:2014-09-03 05:05:10

标签: c# entity-framework

我是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中指定,并且永远不会在其中放入数据,但这看起来很愚蠢。

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

由于您首先使用数据库,因此您还需要重构数据库以在数据库中引入基类

以下是包含PersonUserContact表的架构示例。 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列映射到Id属性
  • 保存

生成的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的所有共享属性和方法,并在需要时检查类型。