实体框架使用外键填充子对象
本文关键字:填充 对象 框架 实体 | 更新日期: 2023-09-27 18:08:12
我希望这不是一个重复,因为我一直在寻找,但我更关注这背后的原因。
我已经设置了一个用户对象。
public class User
{
public User()
{
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int UserID { get; set; }
public Guid UserGuid { get; set; }
public string Email { get; set; }
public string Name { get; set; }
public int CompanyID { get; set; }
public int StatusID { get; set; }
[ForeignKey("StatusID")]
public Status Status { get; set; }
public int RoleID { get; set; }
[ForeignKey("RoleID")]
public UserRole UserRole { get; set; }
}
和子对象
public class UserRole
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int RoleId { get; set; }
public string Role { get; set; }
}
public class Status
{
[Key]
public int StatusId { get; set; }
public string Description { get; set; }
}
当我呼叫
var testuser = dbContext.User.Where(u => u.CompanyID == 1).FirstOrDefault();
我得到用户。状态为空,但用户。StatusID = 1。
但是,如果我调用var status = dbContext.Status.ToList();
var role = dbContext.UserRole.ToList();
var testuser = dbContext.User.Where(u => u.CompanyID == 1).FirstOrDefault();
则调用testuser。状态,我可以看到与StatusId为1相关的正确对象。
谁能解释一下为什么这样可以解决这个问题,以及我如何可以使它工作而不必事先调用以下代码。
var status = dbContext.Status.ToList();
谢谢
您可以尝试如下。
注意:使用立即加载与Include()
主动加载是指查询一个实体类型的过程还将相关实体作为查询
的一部分加载
using System.Data.Entity;
var testuser = dbContext.User.Where(u => u.CompanyID == 1)
.Include(p => p.Status)
.FirstOrDefault();
就像这样使用你的属性。关键字virtual
将其属性设置为延迟加载,然后您可以访问整个对象。
public virtual Status Status { get; set; }
顺便说一句,我编辑了你的课程。有一些不需要的东西,因为你可以通过Status
属性访问StatusID
(像int statID = Status.StatusID;
一样),也可以访问UserRole。
public class User
{
public User()
{
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int UserID { get; set; }
public Guid UserGuid { get; set; }
public string Email { get; set; }
public string Name { get; set; }
public int CompanyID { get; set; }
public virtual Status Status { get; set; }
public virtual UserRole UserRole { get; set; }
}
}