我是EntityFramework的新手,所以问题可能有点愚蠢,但我试图搜索谷歌并没有发现任何内容。
我在db中有一个表:
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
[Required]
public UserProfile Owner { get; set; }
[Required]
public string Mask { get; set; }
[Required]
public string Key { get; set; }
public DateTime Generated { get; set; }
public DateTime DateTo { get; set; }
public bool isElite { get; set; }
其中UserProfile所有者是指向另一个表的链接。 当我做出这样的选择时:
db.Keys.Where(s=>s.Owner.UserId == WebSecurity.CurrentUserId && s.DateTo > DateTime.UtcNow).ToList()
它运作良好,但当我尝试从许可证到达所有者时,它始终为空。 有人可以帮助如何获得所有者的许可证? 谢谢你的时间!
编辑:
我想我犯了一个错误并且发布了一个有点不正确的问题。我真正需要的是当我通过其ID搜索许可证时:
License license = db.Keys.Find(id);
我可以得到主人像:
var a = license.Owner;
我之前使用过Active Record,它“按需”加载了这些数据(只有当我打电话给它时)。我能以某种方式用EF吗?
答案 0 :(得分:2)
使用您拥有的代码,您可以通过在许可证类中将其标记为virtual
来延迟加载所有者。
由于您仍在上下文中(使用数据库),EF会自动调用Owner
来保湿。
关于加载相关实体check this out的好文章。
编辑(使用linq查询):
以下是linq查询的外观示例,但您可能仍需要懒惰或急切加载所有者。
var query = from k in db.Keys
where k.Owner.UserId.Equals(WebSecurity.CurrentUserId)
&& k.DateTo > DateTime.UtcNow
select k;
var list = query.ToList();
答案 1 :(得分:2)
使用DbQuery.Include(字符串路径)方法 Click here
至少这对我有用。
这是你的代码:
db.Keys.Include(“所有者”)。其中(s => s.Owner.UserId == WebSecurity.CurrentUserId&& s.DateTo> DateTime.UtcNow).ToList()
如果您希望“密钥”查询返回大量结果,这可能不是最好的方法。但只有有限数量的结果,它就像一个魅力。