2

我是 EntityFramework 的新手,所以这个问题可能有点愚蠢,但我试图搜索谷歌却一无所获。

我在数据库中有一张桌子:

    [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 Owner 是指向另一个表的链接。当我做出这样的选择时:

 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 以某种方式做到这一点吗?

4

2 回答 2

2

使用您拥有的代码,您可以通过将所有者标记为virtual许可证类来延迟加载所有者。

由于您仍在上下文中(使用 db),EF 将自动调用以水合Owner.

有关加载相关实体的好文章,请查看此

编辑(使用 linq 查询):

下面是 linq 查询的示例,但您仍然可能需要延迟或急切加载 Owners。

var query = from k in db.Keys
            where k.Owner.UserId.Equals(WebSecurity.CurrentUserId)
            && k.DateTo > DateTime.UtcNow
            select k;

var list = query.ToList();
于 2013-02-18T15:17:10.023 回答
2

使用 DbQuery.Include(string path) 方法 点击这里

这至少对我有用。

这将是您的代码:

db.Keys.Include("Owner").Where(s=>s.Owner.UserId == WebSecurity.CurrentUserId && s.DateTo > DateTime.UtcNow).ToList()

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

于 2013-02-18T15:30:04.527 回答