如何使用EntityFramework从不同的视图继承使用TPT?

时间:2019-01-29 16:48:18

标签: asp.net sql-server entity-framework discriminator

假设我有两个表Meetings和Attendees。 我的数据库看起来像这样。

// Table Meeting 
Id
Description
// other properties ...

// Attendee 
Id 
Name
MeetingId
// other properties ...

我有两个映射到这些表的视图。一种是仅包含会议数据的ViewMeetings,另一种是与参加者一起加入的ViewMeetingAttendees。

我想使用每种类型的表(TPT),将每个表映射到一个视图。

public abstract class MeetingBase 
{
    // Some properties here
}

public class ViewMeeting : MeetingBase
{ 
}

public class ViewMeetingAttendee : MeetingBase
{
      public String AttendeeName { get;set; }
}

// Configuration
moduleBuilder.Entity<ViewMeeting>().ToTable("ViewMeetings");
moduleBuilder.Entity<ViewMeetingAttendee>().ToTable("ViewMeetingAttendees");
// NOTE fixed the ViewMeeting error as stated in HansVG answer below.

每次我尝试运行此代码时,都会收到错误消息,列名“ Discriminator”无效

我知道实体框架正在尝试将每个类型的类型解析为表格(TPH)。但是,我仍然想使用继承来映射属性,而无需推断TPH。这是合理的,因为除一列外,所有列均相同。我还有其他十列和两个视图。另外,我有一个会议实体,需要对CRUD操作使用大多数相同的列。

有没有办法保留继承但丢失鉴别错误? [NotMapped]不是选项,因为我仍在从数据库中提取数据。另外,我不喜欢使用LINQ在本地连接表,因为有连接的实体不需要映射。

1 个答案:

答案 0 :(得分:0)

您两次定义了“ ViewMeeting”,并且未配置“ ViewMeetingAttendee”。 您的配置应为:

moduleBuilder.Entity<ViewMeeting>().ToTable("ViewMeetings");
moduleBuilder.Entity<ViewMeetingAttendee>().ToTable("ViewMeetingAttendees");