我无法将查询中的ApplicationUser
对象移至DbContext
。
这是我的Foo
型号
public class Foo
{
public int Id { get; set; }
public string Title { get; set; }
public ApplicationUser Creator { get; set; }
}
在编辑操作中我的Foo控制器内部我想检查请求编辑的用户是创建者。
//ApplicationDbContext inherits IdentityDbContext
private ApplicationDbContext appDb { get; set; }
...
public async Task<ActionResult> Edit(int? id)
{
Foo target = appDb.Foos.First(o => o.Id == id);
if (target == null)
{
return HttpNotFound();
}
if (target.Creator.Id != User.Identity.GetUserId())
{
ViewBag.Error = "Permission denied.";
return Redirect(Request.UrlReferrer.ToString());
}
return View(target);
}
问题在于,由于某些原因,target.Creator
返回null,尽管所有Foo
都引用了Creator
个对象。在同一个控制器中,在细节动作中它被拉得很好:
var entry = appDb.Foos.Where(f=>f.Id == id)
.Select(foo => new FooViewModel()
{
Id = foo.Id,
Title = foo.Title,
CreatorId = foo.Creator.Id,
CreatorName = foo.Creator.FirstName,
}).FirstOrDefaultAsync();
我错过了什么?尝试访问Display查询中的foo.Creator
比尝试直接在Foo对象上访问它有什么不同?当我请求Foo本身时,我以为EF会查询foo.Creator
。
我应该将foo.Creator
改为存储foo.CreatorId
吗?
感谢。
答案 0 :(得分:2)
你需要急切加载 -
var returned = appDb.Foos.First(o => o.Id == id).Include(a => a.Creator);
另一方面,您可以通过将Lazy Loading
成员标记为虚拟来使用ApplicationUser
。