• 13.09.2019
  • 4 minute de citit

In acest articol

Nota

Aceasta caracteristica a fost adaugata sub numele de tipuri de interogare. In EF Core 3.0, conceptul a fost redenumit in tipuri de entitati fara cheie. Adnotarea de date [Keyless] a devenit disponibila in EFCore 5.0.

In plus fata de tipurile de entitati obisnuite, un model EF Core poate contine tipuri de entitati fara cheie , care pot fi utilizate pentru a efectua interogari in baza de date impotriva datelor care nu contin valori cheie.

Definirea tipurilor de entitati fara cheie

Tipurile de entitati fara cheie pot fi definite utilizand fie Adnotarea datelor, fie API-ul Fluent:

  • Adnotari de date
  • API fluent

[Keyless] public class BlogPostsCount {public string BlogName {get; a stabilit; } public int PostCount {get; a stabilit; }}

Caracteristicile tipurilor de entitati fara cheie

Tipurile de entitati fara cheie accepta multe dintre aceleasi capacitati de mapare ca tipurile de entitati obisnuite, cum ar fi maparea mostenirii si proprietatile de navigare. Pe magazinele relationale, pot configura obiectele si coloanele bazei de date tinta prin metode API fluente sau adnotari de date.

Cu toate acestea, acestea sunt diferite de tipurile obisnuite de entitati prin faptul ca:

  • Nu se poate defini o cheie.
  • Nu sunt niciodata urmarite pentru modificari in DbContext si, prin urmare, nu sunt niciodata inserate, actualizate sau sterse in baza de date.
  • Nu sunt descoperite niciodata prin conventie.
  • Suporta doar un subset de capabilitati de cartografiere a navigatiei, in special:
    • Este posibil ca ei sa nu actioneze niciodata ca principalul scop al unei relatii.
    • Este posibil sa nu aiba navigari catre entitati detinute
    • Ele pot contine doar proprietati de navigare de referinta care indica entitati obisnuite.
    • Entitatile nu pot contine proprietati de navigare catre tipuri de entitati fara cheie.
  • Trebuie sa fie configurat cu o adnotare de date [Keyless] sau un apel cu metoda .HasNoKey ().
  • Poate fi mapat la o interogare definitorie . O interogare definitorie este o interogare declarata in model care actioneaza ca sursa de date pentru un tip de entitate fara cheie.

Scenarii de utilizare

Unele dintre principalele scenarii de utilizare pentru tipurile de entitati fara cheie sunt:

Maparea obiectelor bazei de date

Asocierea unui tip de entitate fara cheie la un obiect de baza de date se realizeaza folosind ToTable sau ToView fluent API. Din perspectiva EF Core, obiectul bazei de date specificat in aceasta metoda este o vizualizare , ceea ce inseamna ca este tratat ca o sursa de interogare numai in citire si nu poate fi tinta operatiunilor de actualizare, inserare sau stergere. Cu toate acestea, acest lucru nu inseamna ca obiectul bazei de date este de fapt necesar sa fie o vizualizare a bazei de date. Poate fi alternativ un tabel de baze de date care va fi tratat ca doar in citire. In schimb, pentru tipurile de entitati obisnuite, EF Core presupune ca un obiect de baza de date specificat in metoda ToTable poate fi tratat ca un tabel, ceea ce inseamna ca poate fi utilizat ca sursa de interogare, dar si vizat de operatiuni de actualizare, stergere si inserare. De fapt, puteti specifica numele unei vizualizari a bazei de date in ToTable si totul ar trebui sa functioneze bine atata timp cat vizualizarea este configurata pentru a fi actualizabila in baza de date.

Nota

ToView presupune ca obiectul exista deja in baza de date si nu va fi creat prin migrari.

Exemplu

Urmatorul exemplu arata cum sa utilizati tipuri de entitati fara cheie pentru a interoga o vizualizare a bazei de date.

Bacsis

Puteti vizualiza exemplul acestui articol pe GitHub.

In primul rand, definim un model simplu de blog si postare:

public class Blog {public int BlogId {get; a stabilit; } public string Nume {get; a stabilit; } public string Url {get; a stabilit; } public ICollection <Post> Postari {get; a stabilit; }} public class Post {public int PostId {get; a stabilit; } sir public Titlu {get; a stabilit; } sir public Continut {get; a stabilit; } public int BlogId {get; a stabilit; }}

Apoi, definim o vizualizare simpla a bazei de date care ne va permite sa interogam numarul de postari asociate fiecarui blog:

db.Database.ExecuteSqlRaw (@ “CREATE VIEW View_BlogPostCounts AS SELECT b.Name, Count (p.PostId) as PostCount FROM Blogs b JOIN Posts p on p.BlogId = b.BlogId GROUP BY b.Name”);

Apoi, definim o clasa pentru a retine rezultatul din vizualizarea bazei de date:

public class BlogPostsCount {public string BlogName {get; a stabilit; } public int PostCount {get; a stabilit; }}

Apoi, configuram tipul de entitate fara cheie in OnModelCreating folosind API-ul HasNoKey. Folosim API de configurare fluenta pentru a configura maparea pentru tipul de entitate fara cheie:

protected override void OnModelCreating (ModelBuilder modelBuilder) {modelBuilder .Entity <BlogPostsCount> (eb => {eb.HasNoKey (); eb.ToView (“View_BlogPostCounts”); eb.Property (v => v.BlogName) (HCol). Nume”); }); }

Apoi, configuram DbContext pentru a include DbSet <T>:

public DbSet <BlogPostsCount> BlogPostCounts {get; a stabilit; }

In cele din urma, putem interoga vizualizarea bazei de date in mod standard:

var postCounts = db.BlogPostCounts.ToList (); foreach (var postCount in postCounts) {Console.WriteLine ($ “{postCount.BlogName} are {postCount.PostCount} postari.”); Console.WriteLine (); }

Bacsis

Retineti ca am definit si o proprietate de interogare la nivel de context (DbSet) pentru a actiona ca o radacina pentru interogari impotriva acestui tip.

Bacsis

Pentru a testa tipurile de entitati fara cheie mapate la vizualizari utilizand furnizorul din memorie, le mapeaza la o interogare prin ToInMemoryQuery. Vedeti un esantion rulabil folosind aceasta tehnica pentru mai multe detalii.