0

我有一个代码优先的 EF 实现,我有一个服务层函数GetNavigations()来创建IEnumerable<Navigation>.

GetNavigations()当我运行我的代码并在我的 MVC 视图中点击断点时,我注意到当我尝试访问对象属性时,我的调试指针回到了内部。为什么这样做?它真的一遍又一遍地运行我的功能吗?

我也想知道为什么我的测试不会进入我的函数调用,除非我执行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);
    }

}
4

1 回答 1

1

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

  1. 即时
  2. 延期

在立即执行中,查询将立即在数据库上执行

样品 >db.Foo.Where(f => f.bar == bar).ToList();

对于延迟执行,当您调用它们时,数据库实际上什么都没有发生,只有查询会在那里,当您尝试获取数据时,查询将在数据库中执行

样品 >

var baz = db.Foo.Where(f => f.bar == bar); // no query execution on the database

baz.count(); // deferred execution on database

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

于 2013-09-08T04:37:18.860 回答