实体框架使用外键填充子对象
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 loading 和 Include()
预加载是查询一种类型的实体的过程 还加载相关实体作为查询的一部分
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以上是关于实体框架使用外键填充子对象的主要内容,如果未能解决你的问题,请参考以下文章