Entity Framework: Importare automaticamente JSON

Entity Framework ed io non siamo per nulla amici. Questa verità e’ stata scritta più volte sia sul mio blog che sul mio profilo Linkedin. Eppure questa volta qualcosa e’ cambiato e l’ho usato coscientemente perché sapevo semplificarmi la vita per arrivare al risultato.

Perche EF Core?

Vi spiego meglio il contesto in cui mi trovavo

  • JSON esposto da una API (=chiamata HTTP Get)

  • Database Vuoto (=senza nemmeno una tabella)

Lo ammetto, causa anche pigrizia di base non avevo voglia di creare a mano lo schema del database non avendo lo schema delle tabelle. A questo punto ho fatto il seguente ragionamento. Cosa ho in mano?

  • Ho il JSON

  • Ho le classi per leggere il json

  • Ho un database vuoto

La soluzione e’ stata trovata subito e si chiama Entity Framework. Perché? Una volta che ho in mano il mio DbContext non mi resta che effettuare un AddRange delle liste di classi in mio possesso e mi troverò tutto su database comprese le relazioni tra i diversi oggetti.

Da JSON A Entity Framework

Non descrivero tutti gli step, quelli che ometto e lascio a voi sono:

  • Creazione delle classi in cui effettuare il DeserializeObject del JSON

  • Creazone del DbContext

Il seguente codice vi permettera di effettuare la chiama HTTP Get per leggere il contenuto del JSON

1
2
3
4
5
6

var client = new HttpClient();
var result = await client.GetAsync("https:// ...");
var resp = await result.Content.ReadAsStringAsync();
var items  = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Item>>(resp);

Ora non vi resta che travasare il tutto all’interno del database ottenendo automaticamente (e senza scrivere una riga di SQL) le tabelle ed i relativi valori.

1
2
3
4
5

// _context : From Dependency Injection 
_context.AddRange(items);
_context.SaveChanges();

Pensavate fosse più complicato? Invece no, tutto il codice che vi occorre e’ racchiuso in queste sei righe.

Definizione delle Classi

Prima di chiudere l’articolo vorrei segnalarvi una piccola nota. Il codice che ho mostrato potrebbe funzionarvi la prima volta. Vi state chiedendo in che senso? Se nella definizioni delle classi avete definito la chiave primaria della tabella prima di effettuare AddRange dovete ripulire i dati in ingresso da quelli presenti nel database. Se volete spostare il problema del controllo nel database vi basterà inserire in ogni classe coinvolta la seguente proprietà:

1
2
3
4

[Key]
public Guid RowID { get; set; } = Guid.NewGuid();

Ora vi troverete tutti i dati aggiunti nel database ogni volta, ma con un sacco di duplicati. Una buona soluzione potrebbe essere lanciare una query “SELECT ROW_NUMBER() OVER(PARTITION BY” sulla vera chiave dell’oggetto (e non la nostra guid) cancellando tutto quello che non ha riga uguale 1.

EF Migration

Ricordatevi di aggiungere le migration e di applicarle al database ogni volta che cambiate le classi coinvolte per il travaso di dati.

Nuova Migrazione

Add-Migration

Applicare le Migrazioni

Update-Database

Nota Finale:

Nonostante mi abbia semplificato la vita utilizzare EF Core in questo momento, vi garantisco che continuerò a non sostenerlo e difendere/ diffondere/ sostenere Dapper come se non ci fosse un domani!