从通过两者中的主键联接到主表的辅助表中检索数据

Retrieving data from a secondary table that is joined to the primary one via the primary key in both

提问人:Levi Wallach 提问时间:9/23/2023 最后编辑:marc_sLevi Wallach 更新时间:9/26/2023 访问量:47

问:

我有一个 ASP.NET 核心网站,我正在尝试从旧的网络表单网站构建。目前存在一对一的表关系,其中主表通过两者中的相同 Id 列加入 POC 表。我是 ASP.NET Core 和 Entity Framework 的新手,并试图弄清楚如何在模型和服务中使其工作。ASPNETUsers

下面是两个模型类:

using System.ComponentModel.DataAnnotations.Schema;

namespace Core.Models
{
    [Table("ASPNetUsers")]
    public class UserViewModel
    {
        [System.ComponentModel.DataAnnotations.Key]
        public string Id { get; set; }

        public string UserName { get; set; }
        public string Email { get; set; }
        public string? FirstName { get; set; }
        public string? LastName { get; set; }
        public string? MobilePIN { get; set; }
        public string? PhoneNumber { get; set; }
        public string? PhoneExt { get; set; }

        public POC? POC { get; set; }
    }
}

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace TRRWSCore.Models
{
    [Table("POC")]
    public class POC
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public string Id { get; set; }

        public string? UserId { get; set; }

        [ForeignKey("UserId")]
        public virtual UserViewModel? User { get; set; }

        public string? POCAddress1 { get; set; }
        public string? POCAddress2 { get; set; }
        public string? POCCity { get; set; }
        public string? POCState { get; set; }
        public string? POCZip { get; set; }
        public string? POCTitle { get; set; }
        public string? POCFax { get; set; }
        public bool? ThirdPartyConsultant { get; set; }
    }
}

在我的服务中,我有以下代码:

UserViewModel = await _context.UserInfoDbSet
                              .Include(p => p.POC.Id == id)
                              .Where(a => a.Id == id)
                              .FirstOrDefaultAsync();

UserInfoDbSet是向模型类注册的。我也试过DbSetUserViewModel

UserViewModel = await _context.UserInfoDbSet
                              .Include(p => p.POC)
                              .Where(a => a.Id == id)
                              .FirstOrDefaultAsync();

但两者都产生 null。当我删除该子句时,它确实会生成结果,但它不包括链接的 POC 数据,仅包括 UserViewModel 中的数据。.Include

如何将该数据作为整体结果的一部分插入?

C# 实体框架 LINQ ASP.NET-Core

评论

0赞 GH DevOps 9/23/2023
你有一个表 UserViewModel 和一个具有关联类的表 POC,但你从上下文 (UserInfoDbSet) 中拉取了一个不同的表。它应该在上下文中从 UserViewModel 中拉取:await _context。UserViewModel.Include() 中。其中()...
0赞 Levi Wallach 9/26/2023
该表实际上称为 ASPNetUsers。类是否需要与表同名?我在类名上方有一个语句 - [Table(“ASPNetUsers”)],所以我认为这可能就足够了,但是我是否需要将模型类的名称更改为 ASPNetUsers for Core 才能理解这种关系?

答:

0赞 Christos 9/26/2023 #1

我怀疑问题依赖于已宣布与 FK 关系的事实。在数据库级别,我们更希望有一个 POC ID 列,并定义了一个 FK 约束。所以我们有这样的东西:UserViewModelPOC

[Table("ASPNetUsers")]
public class UserViewModel
{
    [System.ComponentModel.DataAnnotations.Key]
    public string Id { get; set; }

    public string UserName { get; set; }
    public string Email { get; set; }
    public string? FirstName { get; set; }
    public string? LastName { get; set; }
    public string? MobilePIN { get; set; }
    public string? PhoneNumber { get; set; }
    public string? PhoneExt { get; set; }

    public string? POCId { get; set; }
    [ForeignKey("POCId")]
    public virtual POC? POC { get; set; }
}

然后,以下查询将返回您要查找的内容:

UserViewModel = await _context.UserInfoDbSet
                              .Include(p => p.POC)
                              .Where(a => a.Id == id)
                              .FirstOrDefaultAsync();

顺便说一句,TBH 我不明白在 .是否有任何存在而不与 ?如果是这样,那就没问题了。否则,这通常应定义为不可为 null。UserIdPOCPOCUserId

评论

0赞 Levi Wallach 9/26/2023
关于可空 POC 的好点。我一直在查看此 POC 表中的数据,但实际上它不存在,因此整个问题可能没有实际意义。这个应用程序已经存在了 10 多年,随着时间的推移,他们已经改变了数据模型,并且有一些像 POC 这样的表似乎没有目的。似乎正在创建行,但这些行的唯一内容是 ASPNetUsers 表中的外键,因此我可能能够废弃整个表并使事情变得更加简单。但感谢您的提示,因为它对类似情况会有所帮助。