首页 > 解决方案 > 如何使用来自不同视图的 EntityFramework 使用 TPT 进行继承?

问题描述

假设我有两个表会议和与会者。我的数据库看起来像这样。

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

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

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

我想使用每个类型的表(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.

每次我尝试运行此代码时,我都会收到错误 Invalid Column Name "Discriminator"

我了解实体框架正在尝试将类型解析为每个层次结构(TPH)的表。但是,我仍然想在没有推断 TPH 的情况下使用继承来映射属性。这是合理的,因为除了一个之外,所有列都是相同的。我还有十个其他专栏和两个视图。此外,我有一个会议实体需要大部分相同的列进行 CRUD 操作。

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

标签: asp.netsql-serverentity-frameworkdiscriminator

解决方案


您定义了两次“ViewMeeting”,但没有配置“ViewMeetingAttendee”。您的配置应该是:

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

推荐阅读