Професионална програма
Loading...
+ Нов въпрос
Pazzo avatar Pazzo 159 Точки

[Homework] DB Advanced - Intro to EF - Pr. 07 Employees and Projects

Здравейте, 

чудя се над следното нещо - при тази задача, за дърпането на служителите от базата ползвам тази заявка: 

                var employees = db.Employees
                    .Include(e => e.EmployeesProjects)
                    .ThenInclude(ep => ep.Project)
                    .Where(e => e.EmployeesProjects
                                .Any(ep => ep.Project.StartDate >= projectTimeframeStart &&
                                ep.Project.StartDate <= projectTimeframeEnd))
                    .Take(30)
                    .ToList();

 Чуденето ми е свързано с факта, че тази заявка успешно работи до 3тия служител включително - т.е. дърпа си нужната информация, даже по-надолу нормално си печатам служители, мениджъри, проекти, дати... 

На четвъртия служител обаче, програмата гърми с NullReferenceException, защото както се оказа Manager пропъртито в служителя е празно, както и на всички служители надолу. 

Проблемът го реших лесно с .Include(e => e.Manager), но въпросът ми е по-скоро принципен - защо работи до един момент, и после спира? Не би ли трябвало да гърми още в началото щом има проблем, или да си работи нормално до края? Аз поначало умишлено не инклуднах мениджърите, тъй като когато си направя лист само с db.Employees.ToList() по принцип мениджърите им не бяха null, а си имаха инклудната пълната информация. 

Нялкой има ли идея защо така работи? Или по-скоро не работи? ;)

1
Databases Advanced - Entity Framework 07/11/2017 18:43:13
Housey avatar Housey Trainer 129 Точки
Best Answer

Здравей. Наистина доста интересен "бъг" се получава.

Няма проблем без експлицитно да си извикал мениджърите, те да се пълнят автоматично в навигационното пропърти. Причината е, че данните за тези мениджъри се държат в същата таблица (Employees). Това означава, че когато дръпнем служителя, ако този служител се пада мениджър на някого, това ще се запише в пропъртито на съответния служител.

Ясно, обаче откъде идва проблема?

Мениджърите на първите няколко човека се дърпат правилно (съответно с ManagerId 16, 6, 12, 4). Супер, обаче следващия служител има мениджър с Id 263. Обаче ние сме дръпнали само първите 30 служителя, съответно няма как да вземем информация за служител 263, който е мениджър на служителя. Гърмим с NullReferenceException.

2
ambiorix avatar ambiorix 642 Точки

Здравей. Понеже никой вече не гледа форума за жалост си позволих да спомена темата ти във Facebook групата, за да може Владимир ако има повече опит да каже дали е възможно това да е бъг на EF core. Тествах го и при мен и не разбирам защо не дърпа всички записи(или по-скоро защо дърпа първите 3 изобщо като няма .Include()).

1
08/11/2017 18:50:47
Pazzo avatar Pazzo 159 Точки

Много благодаря за разясненията, Влади! Makes perfect sence now. Когато ми минат "Code-First" занимавките, ще отворя пак тая задача да дебъгвам и разгледам в детайли ;) 

Мерси и на теб Жоро, че пусна темата в ФБ групата. Наистина, за съжаление покрай тея ФБ групи форума доооооста замря, помня какво беше по време на PFundamentals например... В крайна сметка - от нас зависи да го поддържаме жив ;)

0