与Asp.net Identity一起使用时,实体框架显示不一致的行为

时间:2015-12-21 17:02:42

标签: asp.net asp.net-mvc entity-framework asp.net-mvc-5 identity

我有3个表分别违反,评论和自动生成的AspNetUsers。它们之间的关系如下。

enter image description here

我使用的是代码优先方法,我的模型如下所示。为简洁起见,删除了一些属性。

违规模式

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无法正确检索数据库记录。我坚持使用它,无法找到原因。

Exception

enter image description here enter image description here

2 个答案:

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

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