我有3个表分别违反,评论和自动生成的AspNetUsers。它们之间的关系如下。
我使用的是代码优先方法,我的模型如下所示。为简洁起见,删除了一些属性。
违规模式
public class Violation
{
public Violation()
{
this.Comments = new HashSet<Comment>();
}
public int Id { get; set; }
public virtual ICollection<Comment> Comments { get; set; }
public virtual ApplicationUser CreatorUser { get; set; }
}
评论模型
public class Comment
{
public int Id { get; set; }
[Required]
public string Content { get; set; }
[Required]
public DateTime PostedDateTime { get; set; }
public ApplicationUser ApplicationUser { get; set; }
public Violation Violation { get; set; }
}
ApplicationUser(AspNetUsers表)
public class ApplicationUser : IdentityUser
{
public ApplicationUser()
{
this.Comments = new List<Comment>();
this.Violations = new List<Violation>();
}
public virtual List<Comment> Comments { get; set; }
public virtual List<Violation> Violations { get; set; }
}
问题在于,当我尝试检索Comment的ApplicationUser导航属性时,我看到其中许多指向null属性,即使数据库为每个属性都有适当的记录。
很快,EF无法正确检索数据库记录。我坚持使用它,无法找到原因。
答案 0 :(得分:2)
实际上,不是懒惰的。您没有将virtual
关键字添加到Comment.ApplicationUser
属性,因此实体框架无法覆盖它以添加延迟加载逻辑。因此,除非您明确加载它,否则它始终为null。添加virtual
关键字,您就可以了。
答案 1 :(得分:1)
如果要填充导航属性,则需要将它们包含在查询中:
var comments = context.Comments
.Include(c => c.Violation)
.Include(c => c.ApplicationUser)
.Where(x => x.Violation.Id == violationId);