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

Posted

技术标签:

【中文标题】实体框架使用外键填充子对象【英文标题】: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).... 【参考方案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; 
   

【讨论】:

谢谢你,延迟加载也能完成我需要的工作,但我想知道急切加载/延迟加载的优缺点是什么,为什么我会选择其中一个?跨度> 这里回答你的问题。我希望它有帮助! ***.com/a/31366407/5592255

以上是关于实体框架使用外键填充子对象的主要内容,如果未能解决你的问题,请参考以下文章

实体框架 6:将子对象添加到父列表与将子对象的导航属性设置为父对象

具有 2 个外键实体框架的表

首次使用实体框架代码时将外键设置为 null

实体框架:0..1 对多外键约束无法识别?

如何阻止实体框架尝试保存/插入子对象?

实体框架6过滤子对象