[英]EF Core entity inheritance from different sources without discriminator
我正在尝试使用EF Core配置下面显示的两个实体:
用户:
public class User
{
public int UserId { get; set; }
public string Title { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
[Required]
public string Email { get; set; }
[NotMapped]
public string FriendlyIdentifier
{
get
{
var name = $"{Name} {Surname}";
if (!string.IsNullOrWhiteSpace(name))
return name;
else if (!string.IsNullOrWhiteSpace(Email))
return Email;
else
return UserId.ToString();
}
}
public ICollection<Booking> Bookings { get; set; }
}
的UserDetails:
public class UserDetails : User
{
public DateTime? LatestBookingDate { get; set; }
}
这样做的原因是我希望能够用最新的预订日期吸引用户,而无需提取所有预订,然后在代码中手动确定最新的预订日期。 为了实现这一点,我创建了一个SQL视图,它选择了最新的预订日期,我想将UserDetails
绑定到此视图。
我有以下EF设置:
modelBuilder.Entity<User>(builder =>
{
builder.ToTable("userdetails");
builder.HasKey(x => x.UserId);
builder.HasIndex(x => new { x.Name, x.Surname, x.Email });
});
modelBuilder.Query<UserDetails>()
.ToView("view_userdetails");
但是,当尝试选择UserDetails
实体时,这会出现以下错误:
'无法将'User'设置为'UserDetails'的基本类型。 继承层次结构不能包含实体类型和查询类型的混合。
我知道有一个HasDiscriminator
扩展,如下所述: https : HasDiscriminator
但我真的没有鉴别器,因为UserDetails
只是一个User
扩展。
我有什么办法让这个工作吗? 我真的不想将User
的属性复制到UserDetails
因为当有任何更改时,有两个实体可以维护。 我想保留继承权。
我想保留继承权。
你不能(至少不是现在的方式)。 异常消息清楚地表明了这一点 - 它说“不能包含混合”,并没有为您提供建议。
你可以做的是将你当前的User
类成员移动到一个新的基本非实体 , 非查询类型类,并让User
实体和UserDetails
查询类型继承它,例如:
public abstract class UserInfo
{
public int UserId { get; set; }
public string Title { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
[Required]
public string Email { get; set; }
[NotMapped]
public string FriendlyIdentifier
{
get
{
var name = $"{Name} {Surname}";
if (!string.IsNullOrWhiteSpace(name))
return name;
else if (!string.IsNullOrWhiteSpace(Email))
return Email;
else
return UserId.ToString();
}
}
public ICollection<Booking> Bookings { get; set; }
}
public class User : UserInfo { }
public class UserDetails : UserInfo
{
public DateTime? LatestBookingDate { get; set; }
}
这将允许您将通用模型保存在一个位置。 缺点是UserDetails
将无法在期望User
的地方User
,并且必须进行转换(尽管由于所有常见属性都相同,因此AutoMapper应该是微不足道的“自动”任务)。
请注意,此解决方案要求您在查询类型中Ignore
Bookings
导航属性:
modelBuilder.Query<UserDetails>(builder =>
{
builder.ToView("view_userdetails");
builder.Ignore(e => e.Bookings);
});
或将其移动到User
实体。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.