我正在使用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。
之后答案 0 :(得分:1)
看起来FooBar
是独立的实体,FooBar1
和FooBar2
是导航属性。在这种情况下,你必须明确地说你想要他们(我们称之为急切加载):
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。
或者你必须打开延迟加载。在视图中首次访问属性后,延迟加载会对数据库进行单独查询。它需要使FooBar1
和FooBar2
虚拟和上下文在呈现视图时必须处于活动状态。通常,这是通过每个HTTP请求的单个上下文来处理的,其中上下文例如在自定义控制器工厂或自定义Http模块中创建和处理。
下次再问你完整的问题。您已经展示了很多代码,但缺少重要的部分(Windget
类和GetById
方法)。这里的不幸用户不是神谕,所以我们需要现在必要的细节。这两种行动方法几乎与您的问题无关。