我有一个代码第一个EF实现,我有一个服务层函数GetNavigations()
,用于创建IEnumerable<Navigation>
。
当我运行我的代码并在我的MVC视图中点击断点时,我注意到当我尝试访问对象属性时,我的调试指针返回到GetNavigations()
内部。为什么这样做?它实际上一遍又一遍地运行我的功能吗?
我也想知道为什么我的测试不会进入我的函数调用,除非我执行result.Count()
。
查看
<ul>
@foreach (var menu1 in Model)
{
<li><a href="@menu1.Url" >@menu1.Text</a>
@if (menu1.SubNavigations.Count > 0)
{
<div>
<ul>
@foreach (var menu2 in menu1.SubNavigations)
{
<li>
<a href="@menu2.Url" >@menu2.Text</a>
</li>
}
</ul>
</div>
}
</li>
}
</ul>
测试方法
INavigationManager oNavMgr = CreateTarget();
// does not step into
var result = oNavMgr.GetNavigations(NavigationType.Main, false);
// but it steps into when i do this.
Assert.IsTrue(result.Count() > 0);
控制器
public class NavigationController : Controller
{
IUnitOfWork m_oUnitOfWork = null;
public NavigationController(IUnitOfWork oUoW)
{
m_oUnitOfWork = oUoW;
}
//
// GET: /Navigation/
public PartialViewResult List(NavigationType iId)
{
var topNavs = m_oUnitOfWork.NavigationManager.GetNavigations(iId);
return PartialView(topNavs);
}
}
答案 0 :(得分:1)
在EntityFramework中,我们有两种类型的查询执行:
在立即执行中,查询将立即在数据库上执行
样本&gt; db.Foo.Where(f => f.bar == bar).ToList();
并且对于延迟执行,当你调用它们时,数据库上实际上没有发生任何事情,只有查询将在那里,当你尝试获取数据时,查询将在数据库中执行
样本&gt;
var baz = db.Foo.Where(f => f.bar == bar); // no query execution on the database
baz.count(); // deferred execution on database
所有这些都是为了优化和更好的体验,只在必要时才在数据库上运行查询。