Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 来自不同来源的EF核心实体继承,无鉴别器_C#_Asp.net_Entity Framework_Asp.net Core_Entity Framework Core - Fatal编程技术网

C# 来自不同来源的EF核心实体继承,无鉴别器

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;

我正在尝试使用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视图,用于选择最新的预订日期,我希望将
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);
});