实体框架使用外键填充子对象

本文关键字:填充 对象 框架 实体 | 更新日期: 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; }
   }
}