实体框架子项为null

时间:2013-02-18 15:13:45

标签: c# entity-framework-5

我是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吗?

2 个答案:

答案 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()

如果您希望“密钥”查询返回大量结果,这可能不是最好的方法。但只有有限数量的结果,它就像一个魅力。