And*_*iss 3 c# asp.net entity-framework entity-framework-core asp.net-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; }
[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; }
}
Run Code Online (Sandbox Code Playgroud)
用户详细信息:
public class UserDetails : User
{
public DateTime? LatestBookingDate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这样做的原因是,我希望能够拉出用户的最新预订日期而不必拉出所有预订,然后在代码中手动确定最新的预订日期。为此,我创建了一个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");
Run Code Online (Sandbox Code Playgroud)
但这在尝试选择UserDetails
实体时会出现以下错误:
'无法将'User'设置为'UserDetails'的基本类型。继承层次结构不能包含实体类型和查询类型的混合。
我知道这里有一个HasDiscriminator
扩展名:https : //docs.microsoft.com/zh-cn/ef/core/modeling/relational/inheritance,但我实际上并没有歧视性,因为UserDetails
它只是扩展名User
。
有什么办法可以使我正常工作吗?我并不是真的想复制User
into 的属性,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; }
}
Run Code Online (Sandbox Code Playgroud)
这将使您可以在一个地方维护通用模型。缺点是UserDetails
将不能在需要User
且必须进行转换的地方使用(尽管由于所有通用属性都相同,所以对于AutoMapper来说,这应该是微不足道的“自动”任务)。
请注意,此解决方案要求您使用查询类型中Ignore
的Bookings
导航属性:
modelBuilder.Query<UserDetails>(builder =>
{
builder.ToView("view_userdetails");
builder.Ignore(e => e.Bookings);
});
Run Code Online (Sandbox Code Playgroud)
或将其移动到User
实体。
归档时间: |
|
查看次数: |
591 次 |
最近记录: |