C# 将编写的类用作EF6实体的基类型
我是EF的新手,仍在努力学习 我有两个表ScheduledEvent和RealizedEvent。显然,这两个事件具有相似的属性,但它们也有一些不同的属性。计划的事件将生成已实现的事件记录,但不必计划已实现的事件。为了简单起见,我在数据库中使用了两个表 在C#中,我希望有一个基本事件类,这两个实体都继承它 我试过了C# 将编写的类用作EF6实体的基类型,c#,entity-framework,C#,Entity Framework,我是EF的新手,仍在努力学习 我有两个表ScheduledEvent和RealizedEvent。显然,这两个事件具有相似的属性,但它们也有一些不同的属性。计划的事件将生成已实现的事件记录,但不必计划已实现的事件。为了简单起见,我在数据库中使用了两个表 在C#中,我希望有一个基本事件类,这两个实体都继承它 我试过了 public class BaseEvent { public virtual int ID { get; set; } ... /*All overlapping
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的所有共享属性和方法,并在需要时检查类型。谢谢您的回答。这真的帮助我了解了更多,并推动了我的前进。我最终使用了一个接口,因此不必重构数据库。我理解,这不是维护性的最佳解决方案。