asp.net - 如何使用来自不同视图的 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 在本地连接表,因为存在不需要以其他方式映射的连接实体。
解决方案
您定义了两次“ViewMeeting”,但没有配置“ViewMeetingAttendee”。您的配置应该是:
moduleBuilder.Entity<ViewMeeting>().ToTable("ViewMeetings");
moduleBuilder.Entity<ViewMeetingAttendee>().ToTable("ViewMeetingAttendees");
推荐阅读
- java - 在 servlet 映射中给出正确的 servlet 名称后,我正在使用 maven 开发项目,但仍然无法给出 classnotfound 异常?
- ios - ATTrackingManager.requestTrackingAuthorization 完成状态返回 notDetermined
- debugging - 如何从文件中间的一行开始重新运行调试?
- android - 如何在多显示器设备的第二个屏幕上启动应用程序
- javascript - 在盒子里着色
- node.js - 将文件添加到 webpack 中的热加载轨道列表
- python - 使用 matplotlib - python 仅保存图形本身
- javascript - 循环嵌套的对象数组
- javascript - 如何使用“for”和字符串替换?
- python - 如何将数组划分为总和最小的子数组