/ / Vyberte plytký objekt z databázy, vypustenie všetkých odkazov z cudzích kľúčov - entity-framework

Vyberte plytký objekt z databázy a zrušte všetky odkazy z cudzích kľúčov - entity-framework

V mojej aplikácii často načítam nejaké dáta z databázy, automaticky ich serializujem a potom niekam posielam.

Štruktúra databázy je dosť komplikovaná, alePredpokladajme, že mám tri vzťahy, A, B a C, kde B a C majú cudzie kľúče smerujúce k A. Medzi týmito vzťahmi je teda možné prechádzať pomocou Vlastnosti navigácie (a páči sa mi táto funkcia, nemám "Nechcem to deaktivovať).

Načítanie údajov sa vykonáva pomocou Entity Framework, takže som ich iba linq z nejakého ObjectContext. K dispozícii je sada možností MergeOptions.NoTracking.

Moja serializácia údajov skontroluje každú vlastnosť a uloží ju určeným spôsobom. Nechcem tento mechanizmus upravovať.

Problém nastane, keď načítam objekt z,povedzme, vzťah A. Vrátim ho zo svojej databázovej vrstvy a odovzdám ho serializácii. Pokúša sa získať prístup k odkazom na B a C, ale aj keď sme mimo kontextu objektu, nemožno to urobiť.

Viem, že môžem urobiť nasledovné:

AEntry a = db.A.FirstOrDefault(something);
a.BReference.Clear(); //(or .Load())
a.CReference.Clear();
return a;

Ale toto riešenie sa mi nepáči.Hľadám niečo, čo by mi umožnilo ponechať objekt „a“ (alebo prípadne kolekciu takýchto objektov) čo nateraterizovaný čo najdlhšie a nechcem sa obťažovať s každým odkazom (pretože môže existovať veľa ich).

Je zrejmé, že v tomto prípade mi nezáleží na obsahu odkazovaných objektov (alebo objektov odkazujúcich na načítaný objekt).

Dúfam, že môj problém je úplne jasný. Vďaka za pomoc.

odpovede:

1 pre odpoveď č. 1

Myslím, že chcete otočiť lenivé načítanie. Pozri táto otázka, buď nastavte vlastnosť ContextOptions vášho ObjectContext:

context.ContextOptions.LazyLoadingEnabled = false;

Alebo ak používate model .edmx, nastavte anotáciu LazyLoadingEnabled:

<EntityContainer Name="MyEntitiesContext" annotation:LazyLoadingEnabled="false">

Samozrejme, budete sa musieť ubezpečiť, že údaje máte robiť potreba je výslovne načítaná potom (pomocou Include() metóda na ObjectQuery.