MVC 3 - Widget在Create动作中很好,但在View动作中具有空值

时间:2011-04-02 00:57:28

标签: asp.net-mvc entity-framework asp.net-mvc-3 model

我正在使用ASP.NET MVC3和Entity Framework。

我有一个Widget控制器,带有标准的Widget CRUD操作。

在我的Create操作中,我成功创建了一个新的Widget对象,该对象有两个FooBar个对象。这很好地添加到我的数据库中,并且操作重定向到View操作。

[HttpPost]
public ActionResult Create(Widget model)
{
    if (ModelState.IsValid)
    {
        //At this point, the widget has two FooBar properties. I can see the values for these FooBars just fine.
        if (repo.AddWidget(model))
        {
            ViewBag.Message = "Your widget has been created.");
            return RedirectToAction("View", new { id = model.Id });
        }
        else
        {
            ViewBag.Error = "Woops, something went wrong. Please try again.");
        }
    }
    return View(model);
}

在View操作中,我从我的存储库中获取新创建的Widget - 除了现在两个FooBar属性为null。

public ActionResult View(int id)
{
    var widget = repo.GetWidget(id);

    if (widget == null)
    {
        ViewBag.Error = "No widget found for the specified ID";
        return RedirectToAction("Find");
    }
    //At this point, the widget has two null values for the FooBar1 and FooBar 2 properties
    return View(widget);
}

在数据库本身,我可以在FooBar上看到正确的Widget ID值。

我的模型设置与本教程中显示的完全相同: http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx

public class WidgetContext : DbContext
{
    public DbSet<Widget> Widgets { get; set; }
    public DbSet<FooBar> FooBars { get; set; }
}

有人可以建议我如何开始跟踪此问题吗?

更新: 每当我调用View操作时,我应该澄清值为null,而不仅仅是在Create。

之后

1 个答案:

答案 0 :(得分:1)

看起来FooBar是独立的实体,FooBar1FooBar2是导航属性。在这种情况下,你必须明确地说你想要他们(我们称之为急切加载):

var widget = context.Widgets
                    .Include(w => w.FooBar1)
                    .Include(w => w.FooBar2)
                    .SingleOfDefault(w => w.Id == id);

注意:强类型包含需要EF 4.1用于EFv1或EFv4使用:

var widget = context.Widgets
                    .Include("FooBar1")
                    .Include("FooBar2")
                    .SingleOfDefault(w => w.Id == id);

或创建自定义强类型扩展方法like this

或者你必须打开延迟加载。在视图中首次访问属性后,延迟加载会对数据库进行单独查询。它需要使FooBar1FooBar2虚拟和上下文在呈现视图时必须处于活动状态。通常,这是通过每个HTTP请求的单个上下文来处理的,其中上下文例如在自定义控制器工厂或自定义Http模块中创建和处理。

下次再问你完整的问题。您已经展示了很多代码,但缺少重要的部分(Windget类和GetById方法)。这里的不幸用户不是神谕,所以我们需要现在必要的细节。这两种行动方法几乎与您的问题无关。