调试时EF的奇怪行为

时间:2013-09-08 03:18:28

标签: c# asp.net-mvc-4 mstest code-first entity-framework-6

我有一个代码第一个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);
    }

}

1 个答案:

答案 0 :(得分:1)

在EntityFramework中,我们有两种类型的查询执行:

  1. 立即
  2. 延迟
  3. 在立即执行中,查询将立即在数据库上执行

    样本&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
    

    所有这些都是为了优化和更好的体验,只在必要时才在数据库上运行查询。