2013-09-08 3 views
0

У меня есть первая реализация EF кода, и у меня есть функция уровня сервиса GetNavigations(), которая создает IEnumerable<Navigation>.EF странное поведение при отладке

Когда я запускаю свой код и ударяю точку останова в моем представлении 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

Как вы передаете «результат» на представление? –

+0

Добавлен код моего контроллера –

+0

Все кажется правильным из того, что вы дали до сих пор ... –

ответ

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 

и все это происходит для оптимизации и лучшего опыта, только запускать запрос по базе данных, когда это необходимо.

+0

Теперь это имеет смысл! Большое вам спасибо! Но почему я не могу войти в функцию, когда я отлаживаю? Любая идея? –

+0

это только мое мнение: я думаю, что когда Microsoft создала Visual Studio, они не рассматривались это поведение в то время, так как будущие версии Visual Studio могут быть отступлены, это вариант –