Entity Framework 与 Asp.net Identity 一起使用时表现出不一致的行为

Entity Framework shows inconsistent behaviour when used with Asp.net Identity

我有 3 个表 Violation、Comment 和自动生成的 AspNetUsers respectively.The 它们之间的关系如下。

我正在使用代码优先方法,我的模型是 follows.Some 为简洁起见删除了属性。

违规模型

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 Table)

 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 导航 属性 时,我看到它们中的许多都指向空值 属性,甚至数据库对它们中的每一个都有正确的记录。

不久,EF 不检索数据库记录properly.I 卡住了,找不到原因。

如果您想要填充导航属性,您需要将它们包含在查询中:

var comments = context.Comments
  .Include(c => c.Violation)
  .Include(c => c.ApplicationUser)
  .Where(x => x.Violation.Id == violationId);

https://msdn.microsoft.com/en-us/data/jj574232.aspx#eager

事实上,不是延迟加载。您没有将 virtual 关键字添加到 Comment.ApplicationUser 属性,因此 Entity Framework 无法覆盖它以添加延迟加载逻辑。因此,除非您显式加载它,否则它始终为 null。添加virtual关键字,就可以了。