【问题标题】:Entity Framework Populating Child Objects using Foreign Key实体框架使用外键填充子对象
【发布时间】:2017-01-30 23:48:05
【问题描述】:

我希望这不是我一直在寻找的重复,但我更多地关注这背后的原因。

我已经设置了一个用户对象。

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();

我得到 users.Status 为空,但 users.StatusID = 1。

但是,如果我打电话

var status = dbContext.Status.ToList();
var role = dbContext.UserRole.ToList();
var testuser = dbContext.User.Where(u => u.CompanyID == 1).FirstOrDefault();

然后调用testuser.Status,可以看到StatusId为1的正确对象。

有人可以解释为什么这会解决问题,以及我如何使它工作而无需事先调用以下命令。

var status = dbContext.Status.ToList();

谢谢

【问题讨论】:

  • Loading Related Entities。基本上在这里你需要预先加载,例如var testuser = dbContext.User.Include(u => u.Status)....

标签: c# entity-framework


【解决方案1】:

你可以试试如下图。

注意:使用 Eager loadingInclude()

预加载是查询一种类型的实体的过程 还加载相关实体作为查询的一部分

using System.Data.Entity;

var testuser = dbContext.User.Where(u => u.CompanyID == 1)
                              .Include(p => p.Status)        
                              .FirstOrDefault();

【讨论】:

  • 虽然两个答案都是正确的,但我已经进行了延迟加载,谢谢您的帮助。
  • 确定没问题:)
【解决方案2】:

就这样使用你的财产。关键字virtual将其属性设置为延迟加载,然后就可以访问整个对象了。

public virtual Status Status { get; set; }

顺便说一句,我编辑了你的课程。有一些不需要的东西,因为您可以通过属性Status(如int statID = Status.StatusID;)访问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; }
   }
}

【讨论】:

  • 谢谢你,延迟加载也能完成我需要的工作,但我想知道急切加载/延迟加载的优缺点是什么,为什么我会选择其中一个?跨度>
  • 这里回答你的问题。我希望它有帮助! stackoverflow.com/a/31366407/5592255
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多