C# 实体框架子项为空

C# 实体框架子项为空,c#,entity-framework-5,C#,Entity Framework 5,我是EntityFramework的新手,所以这个问题可能有点愚蠢,但我试着搜索google,但什么也没找到 我有一张db格式的桌子: [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public Guid Id { get; set; } [Required] public UserProfile Owner { get; set; } [Required]

我是EntityFramework的新手,所以这个问题可能有点愚蠢,但我试着搜索google,但什么也没找到

我有一张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=db.Keys.Find(id)
我可以让主人这样:
var a=license.Owner

我以前使用过Active Record,它“按需”加载此类数据(仅当我调用它时)。我可以用EF实现这一点吗?

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

由于您仍在上下文中(使用db),EF将自动调用
所有者

这是一篇关于加载相关实体的好文章

编辑(使用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();

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

由于您仍在上下文中(使用db),EF将自动调用
所有者

这是一篇关于加载相关实体的好文章

编辑(使用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();

使用DbQuery.Include(字符串路径)方法

这至少对我有好处

以下是您的代码:

db.key.Include(“所有者”)。其中(s=>s.Owner.UserId== WebSecurity.CurrentUserId&&s.DateTo>DateTime.UtcNow.ToList()


如果您希望“Keys”查询返回大量结果,那么这可能不是最好的方法。但是,由于结果数量有限,它的工作非常有魅力。

使用DbQuery.Include(字符串路径)方法

这至少对我有好处

以下是您的代码:

db.key.Include(“所有者”)。其中(s=>s.Owner.UserId== WebSecurity.CurrentUserId&&s.DateTo>DateTime.UtcNow.ToList()


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

如果我只想拥有特定值的所有者?LzyLoading将对找到的每一行发出额外的请求,但我所需要的只是像这样找到所有者:License License=db.Keys.find(id);var o=许可证。所有者;(针对特定的许可证,而不是针对每个许可证)对不起,您能举一个小例子吗?我只是不知道如何使用linq…这正是,b.Keys.Where(s=>s.Owner.UserId==WebSecurity.CurrentUserId&&s.DateTo>DateTime.UtcNow)行的作用。ToList()我编辑了我的文章,我想请看编辑,我第一次描述的问题不是很清楚。@CodeDemen要像活动记录一样拉动,请将此更改:
public UserProfile Owner{get;set;}
更改为this
public virtual UserProfile Owner{get;set;}
,如果我只想拥有特定值的Owner?LzyLoading将对找到的每一行发出额外的请求,但我所需要的只是像这样找到所有者:License License=db.Keys.find(id);var o=许可证。所有者;(针对特定的许可证,而不是针对每个许可证)对不起,您能举一个小例子吗?我只是不知道如何使用linq…这正是,b.Keys.Where(s=>s.Owner.UserId==WebSecurity.CurrentUserId&&s.DateTo>DateTime.UtcNow)行的作用。ToList()我编辑了我的文章,我想请看编辑,我第一次描述的问题不是很清楚。@CodeDemen要像活动记录一样拉动,请更改以下内容:
public UserProfile Owner{get;set;}
到这个
public virtual UserProfile Owner{get;set;}
有成吨(约10000)的结果,因此,我需要的是在我通过ID搜索时获得包含所有者的完整特定许可证。@CodeDemen这正是您通过此查询得到的。@CodeDemen:从您的模型中我可以看到,我给您的查询实际上应该返回一个列表(或者是列表。不能肯定吗?)如果所有者是一对零/一关系(应该是这样的,否则您需要一个UserProfile对象集合而不是一个UserProfile),则包含一个项目有成吨(约10000)的结果,因此,我需要的是在我通过ID搜索时获得包含所有者的完整特定许可证。@CodeDemen这正是您通过此查询得到的。@CodeDemen:从您的模型中我可以看到,我给您的查询实际上应该返回一个列表(或者是列表。不能肯定吗?)如果所有者是一对零/一关系(应该是这样的。否则,您需要一个UserProfile对象集合而不是一个UserProfile),则包含单个项。密钥和许可证对象的关系如何?当实体名称为“许可证”时,实体集名称是否为“密钥”?根据您的代码示例,我会这么认为。澄清这一点有助于我们更好地了解您的问题密钥和许可证对象是如何相关的?当实体名称为“许可证”时,实体集名称是否为“密钥”?根据您的代码示例,我会这么认为。澄清这一点有助于我们更好地理解您的问题