c# - EF TPT 继承和自引用
问题描述
我有以下 EF 实体类的结构:
public abstract class CalendarItem
{
public Guid CalendarItemId { get; set; }
public Guid? ParentCalendarItemId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual CalendarItem ParentCalendarItem { get; set; }
public virtual ICollection<CalendarItem> ChildCalendarItems { get; set; }
}
public class CalendarSlot : CalendarItem
{
public bool IsAvailable { get; set; }
}
public class CalendarSession : CalendarEvent
{
public DateTimeOffset StartDateTime { get; set; }
public DateTimeOffset EndDateTime { get; set; }
}
映射配置如下:
public class CalendarItemMap
{
public static void Map(ModelBuilder modelBuilder)
{
modelBuilder.Entity<CalendarItem>().ToTable("CalendarItem");
modelBuilder.Entity<CalendarItem>().HasKey(t => t.CalendarItemId);
modelBuilder.Entity<CalendarItem>().HasOne(ci => ci.ParentCalendarItem)
.WithMany(cs => cs.ChildCalendarItems).HasForeignKey(cs => cs.ParentCalendarItemId);
}
}
使用 DbSets 作为:
public DbSet<CalendarItem> CalendarItems { get; set; }
public DbSet<CalendarSession> CalendarSessions { get; set; }
public DbSet<CalendarSlot> CalendarSlots { get; set; }
我的问题是如何在提供继承的情况下正确组织基类的自引用(树)结构。所有类型的实体,即 CalendarSlot 和 CalendarSession 都应该有自己的引用,CalendarItem 不能创建为实例。在数据库中,树结构在 CalendarItem 表中实现。CalendarSlot/CalendarSession 表与 CalendarItem 具有 1-1 关系。
问题是,在我的代码中,我有一个通用方法的位置,它将模型转换为 API 的合同:
internal static TContract ToCalendarItem<TContract, TModel>(TModel calendarItemModel)
where TContract : Contract.CalendarItem, new()
where TModel : Model.CalendarItem
{
return new()
{
CalendarItemId = calendarItemModel.CalendarItemId,
Name = calendarItemModel.Name,
Description = calendarItemModel.Description,
ParentCalendarItem = calendarItemModel.ParentCalendarItem != null ? ToCalendarItem<TContract, TModel>(calendarItemModel.ParentCalendarItem) : null
};
}
并在行中
ParentCalendarItem = calendarItemModel.ParentCalendarItem != null ? ToCalendarItem<TContract, TModel>(calendarItemModel.ParentCalendarItem) : null
我有一个错误"Argument 1: Cannot convert from 'Model.CalendarItem' to TModel"。我如何告诉系统calendarItemModel.ParentCalendarItem
应该始终是 TModel (从 派生的类Model.CalendarItem
)?
我在这里做错了什么?先感谢您。
解决方案
推荐阅读
- sql - 9 月 1 日在 8 月 31 日之前在 Zeppelin 中按日期排序的条形图,请问如何解决?
- amazon-web-services - 如何在 AWS API Gateway 中映射每条路由
- javascript - 在 javascript 或 jquery 中添加指向数据表行的链接
- json - 我如何使用表单请求和 ajax json 验证 laravel 8 的响应
- wpf - Powershell - 在 WinForm 选项卡中嵌入 WPF 表单
- postgresql - Postgres SQL表分区按范围时间戳不是唯一键冲突
- python-3.x - 将带有命名空间的 XML 解析为 CSV
- r - 哪个 R 命令在 R 中显示整个数据帧数据和结构?
- gitlab - 托管多个需要在 gitlab ci 上打开相同端口的服务
- reactjs - HashRouter 多个布局将始终显示一个布局