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