C# 来自不同来源的EF核心实体继承,无鉴别器
我正在尝试使用EF Core配置以下两个实体: 用户:C# 来自不同来源的EF核心实体继承,无鉴别器,c#,asp.net,entity-framework,asp.net-core,entity-framework-core,C#,Asp.net,Entity Framework,Asp.net Core,Entity Framework Core,我正在尝试使用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;
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; }
}
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");
modelBuilder.Entity(builder=>
{
建造商。ToTable(“用户详细信息”);
HasKey(x=>x.UserId);
HasIndex(x=>new{x.Name,x.姓氏,x.Email});
});
modelBuilder.Query()
.ToView(“查看用户详细信息”);
但在尝试选择UserDetails
实体时,会出现以下错误:
'无法将'User'设置为'UserDetails'的基本类型。遗产
层次结构不能包含实体类型和查询类型的混合。”
我知道这里有一个HasDiscriminator
扩展:但我没有真正的鉴别器,因为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; }
}
或者将其移动到
用户
实体。谢谢@ivan。这是一个相当合理的解决方案。我可能需要对我的服务进行一些更改,以便它们将UserInfo
而不是User
作为参数,但这并不是世界末日。也许您可以将LatestBookingDate
作为计算列添加到userdetails
表中。
modelBuilder.Query<UserDetails>(builder =>
{
builder.ToView("view_userdetails");
builder.Ignore(e => e.Bookings);
});