EF中恢复的对象中的空属性

时间:2015-11-23 12:16:40

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

我无法将查询中的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吗?

感谢。

1 个答案:

答案 0 :(得分:2)

你需要急切加载 -

var returned = appDb.Foos.First(o => o.Id == id).Include(a => a.Creator);

另一方面,您可以通过将Lazy Loading成员标记为虚拟来使用ApplicationUser