- 16.06.2014
- 5 minute de citit
In acest articol
de Mike Wasson
Descarcati proiectul finalizat
Aceasta sectiune descrie cateva detalii despre modul in care EF incarca entitatile conexe si cum sa gestioneze proprietatile de navigare circulare in clasele dvs. de model. (Aceasta sectiune ofera cunostinte de baza si nu este necesara pentru a finaliza tutorialul. Daca preferati, treceti la partea 5 ..)
Incarcare dornica versus incarcare lenesa
Cand utilizati EF cu o baza de date relationala, este important sa intelegeti modul in care EF incarca datele aferente.
De asemenea, este util sa vedeti interogarile SQL generate de EF. Pentru a urmari SQL, adaugati urmatoarea linie de cod la constructorul BookServiceContext:
public BookServiceContext (): base (“nume = BookServiceContext”) {// Cod nou: this.Database.Log = s => System.Diagnostics.Debug.WriteLine (s); }
Daca trimiteti o solicitare GET catre / api / books, acesta returneaza JSON, dupa cum urmeaza:
[{“BookId”: 1, “Title”: “Pride and Prejudice”, “Year”: 1813, “Price”: 9.99, “Gen”: “Comedy of maniers”, “AuthorId”: 1, “Author”: nul }, …
Puteti vedea ca proprietatea Author este nula, chiar daca cartea contine un AuthorId valid. Asta pentru ca EF nu incarca entitatile autor asociate. Jurnalul de urmarire al interogarii SQL confirma acest lucru:
SELECT [Extent1]. [BookId] AS [BookId], [Extent1]. [Title] AS [Title], [Extent1]. [Year] AS [Year], [Extent1]. [Price] AS [Price], [ Extent1]. [Gen] AS [Gen], [Extent1]. [AuthorId] AS [AuthorId] FROM [dbo]. [Carti] AS [Extent1]
Instructiunea SELECT ia din tabelul Carti si nu face referire la tabelul Autor.
Pentru referinta, iata metoda din clasa BooksController care returneaza lista cartilor.
public IQueryable <Book> GetBooks () {return db.Books; }
Sa vedem cum putem returna autorul ca parte a datelor JSON. Exista trei moduri de a incarca datele conexe in Entity Framework: incarcare dornica, incarcare lenesa si incarcare explicita. Exista compromisuri cu fiecare tehnica, deci este important sa intelegem cum functioneaza acestea.
Incarcare dornica
Cu o incarcare dornica , EF incarca entitatile conexe ca parte a interogarii initiale a bazei de date. Pentru a efectua incarcari dornice, utilizati metoda de extensie System.Data.Entity.Include .
public IQueryable <Book> GetBooks () {return db.Books // new code: .Include (b => b.Author); }
Aceasta ii spune EF sa includa datele autorului in interogare. Daca faceti aceasta modificare si rulati aplicatia, acum datele JSON arata astfel:
[{“BookId”: 1, “Title”: “Pride and Prejudice”, “Year”: 1813, “Price”: 9.99, “Gen”: “Comedy of maniers”, “AuthorId”: 1, “Author”: {“AuthorId”: 1, “Name”: “Jane Austen”}}, …
Jurnalul de urmarire arata ca EF a efectuat o unire pe tabelele Book si Author.
SELECT [Extent1]. [BookId] AS [BookId], [Extent1]. [Title] AS [Title], [Extent1]. [Year] AS [Year], [Extent1]. [Price] AS [Price], [ Extent1]. [Gen] AS [Gen], [Extent1]. [AuthorId] AS [AuthorId], [Extent2]. [AuthorId] AS [AuthorId1], [Extent2]. [Name] AS [Name] FROM [dbo] . [Carti] AS [Extent1] INNER JOIN [dbo]. [Authors] AS [Extent2] ON [Extent1]. [AuthorId] = [Extent2]. [AuthorId]
Incarcare lenesa
Cu incarcarea lenesa, EF incarca automat o entitate legata atunci cand proprietatea de navigatie pentru acea entitate este dereferentiata. Pentru a activa incarcarea lenesa, faceti proprietatea de navigare virtuala. De exemplu, la clasa Carte:
public class Book {// (Alte proprietati) // Navigatie virtuala proprietate publica virtuala Autor Autor {get; a stabilit; }}
Acum ia in considerare urmatorul cod:
var books = db.Books.ToList (); // Nu incarca autorii var author = carti [0] .Autor; // Incarca autorul pentru carti [0]
Cand este activata incarcarea lenesa, accesarea proprietatii Autor pe carti [0] determina EF sa interogheze baza de date pentru autor.
Incarcarea lenesa necesita mai multe calatorii in baza de date, deoarece EF trimite o interogare de fiecare data cand preia o entitate legata. In general, doriti ca incarcarea lenesa sa fie dezactivata pentru obiectele pe care le serializati. Serializatorul trebuie sa citeasca toate proprietatile modelului, ceea ce declanseaza incarcarea entitatilor asociate. De exemplu, iata interogarile SQL cand EF serializeaza lista cartilor cu incarcarea lenesa activata. Puteti vedea ca EF face trei interogari separate pentru cei trei autori.
SELECT [Extent1]. [BookId] AS [BookId], [Extent1]. [Title] AS [Title], [Extent1]. [Year] AS [Year], [Extent1]. [Price] AS [Price], [ Extent1]. [Gen] AS [Gen], [Extent1]. [AuthorId] AS [AuthorId] FROM [dbo]. [Carti] AS [Extent1] SELECT [Extent1]. [AuthorId] AS [AuthorId], [Extent1] . [Nume] AS [Nume] FROM [dbo]. [Autori] AS [Extent1] WHERE [Extent1]. [AuthorId] = @ EntityKeyValue1 SELECT [Extent1]. [AuthorId] AS [AuthorId], [Extent1]. [Nume ] AS [Name] FROM [dbo]. [Authors] AS [Extent1] WHERE [Extent1]. [AuthorId] = @ EntityKeyValue1 SELECT [Extent1]. [AuthorId] AS [AuthorId], [Extent1]. [Name] AS [ Nume] FROM [dbo]. [Autori] AS [Extent1] WHERE [Extent1]. [AuthorId] = @ EntityKeyValue1
Exista inca momente in care este posibil sa doriti sa utilizati incarcarea lenesa. Incarcarea dornica poate determina EF sa genereze o imbinare foarte complexa. Sau este posibil sa aveti nevoie de entitati conexe pentru un subset mic de date, iar incarcarea lenesa ar fi mai eficienta.
O modalitate de a evita problemele de serializare este serializarea obiectelor de transfer de date (DTO) in locul obiectelor de entitate. Voi arata aceasta abordare mai tarziu in articol.
Incarcare explicita
Incarcarea explicita este similara cu incarcarea lenesa, cu exceptia faptului ca primiti in mod explicit datele aferente in cod; nu se intampla automat cand accesati o proprietate de navigare. Incarcarea explicita va ofera mai mult control asupra momentului de incarcare a datelor conexe, dar necesita cod suplimentar. Pentru mai multe informatii despre incarcarea explicita, consultati Incarcarea entitatilor conexe.
Proprietati de navigare si referinte circulare
Cand am definit modelele Book si Author, am definit o proprietate de navigare in clasa Book pentru relatia Book-Author, dar nu am definit o proprietate de navigare in cealalta directie.
Ce se intampla daca adaugati proprietatea de navigare corespunzatoare la clasa Autor?
public class Author {public int AuthorId {get; a stabilit; } [Obligatoriu] sir public Nume {get; a stabilit; } public ICollection <Book> Books {get; a stabilit; }}
Din pacate, acest lucru creeaza o problema atunci cand serializati modelele. Daca incarcati datele aferente, acesta creeaza un grafic circular de obiecte.
Cand formatatorul JSON sau XML incearca sa serializeze graficul, acesta va arunca o exceptie. Cele doua formatari lanseaza mesaje de exceptie diferite. Iata un exemplu pentru formatatorul JSON:
{“Message”: “A aparut o eroare.”, “ExceptionMessage”: “Tipul ‘ObjectContent`1’ nu a reusit sa serializeze corpul de raspuns pentru tipul de continut ‘application / json; charset = utf-8’.”, “ExceptionType “:” System.InvalidOperationException “,” StackTrace “: null,” InnerException “: {” Message “:” A aparut o eroare. “,” ExceptionMessage “:” Bucla de auto-referinta detectata cu tipul ‘BookService.Models.Book’. Calea ‘[0] .Author.Books’. “,” ExceptionType “:” Newtonsoft.Json.JsonSerializationException “,” StackTrace “:” … “}}
Iata formatatorul XML:
<Error> <Message> A aparut o eroare. </Message> <ExceptionMessage> Tipul „ObjectContent`1” nu a reusit sa serializeze corpul de raspuns pentru tipul de continut „application / xml; charset = utf-8 ‘. </ExceptionMessage> <ExceptionType> System.InvalidOperationException </ExceptionType> <StackTrace /> <InnerException> <Message> A aparut o eroare. </Message> <ExceptionMessage> Graficul obiectelor pentru tipul „BookService. Models.Author ‘contine cicluri si nu poate fi serializat daca urmarirea referintelor este dezactivata. </ExceptionMessage> <ExceptionType> System.Runtime.Serialization.SerializationException </ExceptionType> <StackTrace> … </StackTrace> </InnerException> </ Eroare>
O solutie este utilizarea DTO-urilor, pe care le descriu in sectiunea urmatoare. Alternativ, puteti configura formatatorii JSON si XML pentru a gestiona ciclurile grafice. Pentru mai multe informatii, consultati Manipularea referintelor de obiecte circulare.
Pentru acest tutorial, nu aveti nevoie de proprietatea de navigare Author.Book, astfel incat sa o puteti lasa afara.
fregna xxx xxx senza mutande
la.maestra analfabeta xxx serena
valentina nappi brazzers xxx sex italia
italian porn tv xxx sex italian
blowjob on the beach xxx sex taxi
italian porn sites xxx siffredi
roberta gemma porn hd xxx stop
malena la pugliese infermiera xxx stream porn
porno capuccetto rosso xxx streaming
vip porche xxx streaming film
mai dire gf streaming xxx streaming porno
valentine demy hd xxx streaming tv
priscilla salerno scopa xxx streming
krisztina ventura xxx striming
video porno gratis roberta gemma xxx tacchi
streaming violetta xxx tatoo
xxx freeporn xxx taxi
deepthroat italian xxx telecamera nascosta
contessa porno xxx telecamere nascoste
troie cento per cento xxx tette enormi








