我的ASP.NET MVC 4应用程序使用Entity Framework v5,Ninject和Ninject.MVC3 NuGet包,并且数据存储在SQL Server Express中。使用“EF 5.x DbContext生成器 for C#”模板生成模型。我的edmx中启用了延迟加载。
我正在使用存储库模式,我的存储库和上下文位于解决方案中的一个单独项目中,该项目由ASP.NET MVC 4项目引用。
问题在于,在保存视图模型属性之一的新对象(“Trade”)之后,我查询该对象的存储库。此时,我期望被填充的导航属性为空。请参见下面Create()方法中的注释。
如果我从数据库中检索现有的Trade(我没有保存过的Trade),则似乎所有导航属性都已填充。
我在这个页面上找到了一个类似/相同问题的报告。文章的作者指出,“我认为这是DbContext中的一个故障。即外键导航属性的惰性加载对于新添加的项不起作用,但是many end中的导航属性的惰性加载效果很好,例如Teacher.Classes。这个故障仅发生在新添加的项中。如果您不在新添加的项上方显式地加载Class.Teacher,则在Entity Framework中尚未加载的情况下它将为空。但是,如果它已经在某个地方加载了,则Entity Framework可以自动解析C.Teacher。而对于ObjectContext,所有类型的导航属性都可以使用延迟加载。”
我的控制器Create方法如下:
员工存储库中的SaveTrade()方法如下所示:
最后,_employeesRepository中的交易如下所示:
我正在使用存储库模式,我的存储库和上下文位于解决方案中的一个单独项目中,该项目由ASP.NET MVC 4项目引用。
问题在于,在保存视图模型属性之一的新对象(“Trade”)之后,我查询该对象的存储库。此时,我期望被填充的导航属性为空。请参见下面Create()方法中的注释。
如果我从数据库中检索现有的Trade(我没有保存过的Trade),则似乎所有导航属性都已填充。
我在这个页面上找到了一个类似/相同问题的报告。文章的作者指出,“我认为这是DbContext中的一个故障。即外键导航属性的惰性加载对于新添加的项不起作用,但是many end中的导航属性的惰性加载效果很好,例如Teacher.Classes。这个故障仅发生在新添加的项中。如果您不在新添加的项上方显式地加载Class.Teacher,则在Entity Framework中尚未加载的情况下它将为空。但是,如果它已经在某个地方加载了,则Entity Framework可以自动解析C.Teacher。而对于ObjectContext,所有类型的导航属性都可以使用延迟加载。”
我的控制器Create方法如下:
[HttpPost]
public ActionResult Create(TradeViewModel tradeViewModel)
{
if (ModelState.IsValid)
{
_employeesRepository.SaveTrade(tradeViewModel.Trade);
var trade =
_employeesRepository.Trades.First(
x =>
x.RequesterId == tradeViewModel.Trade.RequesterId &&
x.RequesterWorkDate == tradeViewModel.Trade.RequesterWorkDate);
// Null reference encountered below, as trade.TradeType and trade.Employee are both null
String userMessage = "New " + trade.TradeType.TradeTypeDescription + " requested with '" + ControllerHelpers.GetDisplayName(trade.Employee) + "'";
TempData["UserMessage"] = userMessage;
return RedirectToAction("Index");
}
return View();
}
员工存储库中的SaveTrade()方法如下所示:
public void SaveTrade(Trade trade)
{
var data = (from t in _context.Trades
where t.RequesterId == trade.RequesterId
&& t.RequesterWorkDate == trade.RequesterWorkDate
select t);
if (!data.Any())
{
_context.Trades.Add(trade);
}
_context.SaveChanges();
}
最后,_employeesRepository中的交易如下所示:
public IQueryable<Trade> Trades
{
get { return _context.Trades; }
}