Pri nastavovaní dychtivého načítania v čase vytvorenia kontextu, mnoho príkladov použitia Include
v EF vyzerá takto (vzhľadom na dva súvisiace subjekty nazvané Zdroje a variácie):
var context = new MyContext();
context.Resources.Include(x => x.Variations).First();
return context;
Ale iní nie:
context.Resources.Include(x => x.Variations);
Zdá sa, že len prvý z nich pracuje pre mňa, ale nemôžem nájsť žiadne vysvetlenie, prečo je to potrebné?
odpovede:
2 pre odpoveď č. 1context.Resources.Include(x => x.Variations);
konštruuje dotaz, ktorý pri spustení načíta všetkya ich variácií. Potom tento dotaz zahodíte. Nikdy nevykonávate dotaz, čo znamená, že nezískate výsledky dotazu a nedostanete vedľajšie účinky vykonávania tohto dotazu.
Môžete buď urobiť niečo so zdrojmi:
foreach (var resource in context.Resources.Include(x => x.Variations))
{
/* ... */
}
alebo ak chcete, aby sa objekty zobrazovali iba vo vašom kontexte,
using System.Data.Entity;
context.Resources.Include(x => x.Variations).Load();
Pokiaľ je mi známe, neexistuje spôsob, ako vytvoriť kontext, aby sa účinok .Include
sa vždy implicitne vykonáva pri vytváraní dotazu. Musíte ho zahrnúť do každého dotazu.
0 pre odpoveď č. 2
Keď to urobíte
context.Resources.Include(x => x.Variations);
dostanete zoznam objektov Resource. použitím .First()
vám poskytne prvý zdroj v tomto zozname zdrojov.
0 pre odpoveď č. 3
V skratke: nazýva sa efektom inej entity loading "s, V rámci Entity Framework existujú tri rebríčky: lenivé, explicitné a netrpezlivo načítané prístupy, z ktorých si môžete vybrať, a použiť ich v kóde.
Inými slovami, Entity Framework podporuje tri spôsoby načítania príbuzných subjektov:
- očakávané zaťaženie
- lenivé zaťaženie
- explicitné zaťaženie
Obe tri techniky uvedené vyššie sú podrobne diskutované v tomto článku - Prebieha načítavanie súvisiacich subjektov.
Nižšie uvedený fragment kódu používa netrpezlivo načítanie:
context.Resources.Include(x => x.Variations).First();
Zdá sa, že len prvý z nich pracuje pre mňa, ale nemôžem nájsť žiadne vysvetlenie, prečo je to potrebné?
Neskorší fragment kódu (ten bez .First()
) nefunguje pre vás, pretože načítanie príbuzných subjektov je možné dosiahnuť pomocou očakávané zaťaženie (pozrite si vyššie uvedené nadmieru načítané osoby) alebo Spôsob zaťaženia:
context.Resources.Include(x => x.Variations).Load();
// or a sample like
// Load the posts related to a given blog
context.Entry(blog).Collection(p => p.Posts).Load();
edit: Ak sa z nejakého dôvodu zmätíte s lenivým načítaním, potom môžete túto možnosť použiť vypnúť v kontexte.
public MyContext()
{
this.Configuration.LazyLoadingEnabled = false;
}