提问人:Levi Wallach 提问时间:9/23/2023 最后编辑:marc_sLevi Wallach 更新时间:9/26/2023 访问量:47
从通过两者中的主键联接到主表的辅助表中检索数据
Retrieving data from a secondary table that is joined to the primary one via the primary key in both
问:
我有一个 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
是向模型类注册的。我也试过DbSet
UserViewModel
UserViewModel = await _context.UserInfoDbSet
.Include(p => p.POC)
.Where(a => a.Id == id)
.FirstOrDefaultAsync();
但两者都产生 null。当我删除该子句时,它确实会生成结果,但它不包括链接的 POC 数据,仅包括 UserViewModel 中的数据。.Include
如何将该数据作为整体结果的一部分插入?
答:
0赞
Christos
9/26/2023
#1
我怀疑问题依赖于已宣布与 FK 关系的事实。在数据库级别,我们更希望有一个 POC ID 列,并定义了一个 FK 约束。所以我们有这样的东西:UserViewModel
POC
[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。UserId
POC
POC
UserId
评论
0赞
Levi Wallach
9/26/2023
关于可空 POC 的好点。我一直在查看此 POC 表中的数据,但实际上它不存在,因此整个问题可能没有实际意义。这个应用程序已经存在了 10 多年,随着时间的推移,他们已经改变了数据模型,并且有一些像 POC 这样的表似乎没有目的。似乎正在创建行,但这些行的唯一内容是 ASPNetUsers 表中的外键,因此我可能能够废弃整个表并使事情变得更加简单。但感谢您的提示,因为它对类似情况会有所帮助。
评论