gpt4 book ai didi

c# - 没有鉴别器的来自不同来源的 EF Core 实体继承

转载 作者:行者123 更新时间:2023-11-30 13:53:42 33 4
gpt4 key购买 nike

我正在尝试使用 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; }
}

用户详细信息:

public class UserDetails : User
{
public DateTime? LatestBookingDate { get; set; }
}

这样做的原因是我希望能够拉取用户的最新预订日期,而不必拉取所有预订,然后在代码中手动确定最新预订日期。为此,我创建了一个选择最新预订日期的 SQL View ,并且我想将 UserDetails 绑定(bind)到该 View 。

我有以下 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 实体时会出现以下错误:

'Cannot set 'User' as the base type of 'UserDetails'. Inheritance hierarchies cannot contain a mix of entity types and query types.'

我知道这里有一个 HasDiscriminator 扩展:https://learn.microsoft.com/en-us/ef/core/modeling/relational/inheritance但我真的没有鉴别器,因为 UserDetails 只是 User 的扩展。

我有什么方法可以让它正常工作吗?我真的不想将 User 的属性复制到 UserDetails 中,因为这样在发生任何更改时有两个实体需要维护。我想保留遗产。

最佳答案

I would like to retain the inheritance.

你不能(至少不能像现在这样)。异常消息清楚地表明了这一点 - 它说“不能包含混合”并且不会为您提供建议。

你可以做的是将你当前的 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 的地方使用,必须进行转换(尽管由于所有公共(public)属性都相同,因此应该是 AutoMapper 的简单“自动”任务)。

请注意,此解决方案要求您忽略查询类型中的Bookings 导航属性:

modelBuilder.Query<UserDetails>(builder =>
{
builder.ToView("view_userdetails");
builder.Ignore(e => e.Bookings);
});

或将其移动到 User 实体。

关于c# - 没有鉴别器的来自不同来源的 EF Core 实体继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53673097/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com