Loading...
Pazzo avatar Pazzo 158 Точки

[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 640 Точки

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

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

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

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

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.