{"id":5308,"date":"2024-08-20T13:34:07","date_gmt":"2024-08-20T11:34:07","guid":{"rendered":"https:\/\/viva.racunalniske-novice.com\/objektno-relacijsko-mapiranje-z-entity-framework\/"},"modified":"2024-08-20T13:34:07","modified_gmt":"2024-08-20T11:34:07","slug":"objektno-relacijsko-mapiranje-z-entity-framework","status":"publish","type":"post","link":"https:\/\/viva.racunalniske-novice.com\/it\/mappatura-relazionale-degli-oggetti-con-il-framework-delle-entita\/","title":{"rendered":"Mappatura relazionale di oggetti con Entity Framework"},"content":{"rendered":"<p><em>Autore: Denis Balant, Enej Hudobreznik<\/em><\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>Nonostante il rapido sviluppo della tecnologia, il linguaggio principale per la gestione dei database relazionali \u00e8 ancora SQL. linguaggio di query strutturato, che con molti derivati personalizzati (PostgreSQL, MySQL...) affonda le sue radici negli anni &#039;70 del secolo scorso.&nbsp;<\/p>\n\n\n\n<p>Scrivere query SQL spesso risulta essere un lavoro piuttosto dispendioso in termini di tempo, soprattutto con strutture di database pi\u00f9 complesse. Invece di scrivere manualmente query e conversioni in oggetti, tipico dei linguaggi di programmazione orientati agli oggetti, \u00e8 molto pi\u00f9 naturale e spesso pi\u00f9 semplice mappare le classi dal codice sorgente allo schema dei dati e non viceversa. Ci\u00f2 fa risparmiare tempo di sviluppo e allo stesso tempo \u00e8 molto pi\u00f9 semplice riconoscere le relazioni tra le entit\u00e0. Questo metodo \u00e8 chiamato mappatura relazionale degli oggetti (ORM).<\/p>\n\n\n\n<p>Per l&#039;ambiente .NET, Microsoft offre a questo scopo il framework open source Entity Framework Core (in breve EF Core), che consente lo sviluppo orientato ai dati (approccio Code First), in cui i dati interconnessi vengono semplicemente raccolti in classi che rappresentano tabelle, e il framework si basa su di essi, comprende le relazioni e crea uno schema di database nel proprio formato. Il pi\u00f9 grande vantaggio di questo approccio \u00e8 la possibilit\u00e0 di installare lo schema dei dati sul database desiderato senza conoscere SQL.<\/p>\n\n\n\n<p>EF Core comunica con i database tramite librerie plug-in denominate provider di database, quindi passare a un altro database \u00e8 semplice. Questi possono essere installati dall&#039;utente tramite il gestore pacchetti (NuGet per C#). Le librerie ufficiali sono disponibili solo per le soluzioni SQL Server e Azure Cosmos DB di Microsoft e per il progetto SQLite e, grazie alla forte comunit\u00e0 open source, il framework supporta praticamente tutti i principali database relazionali (MySQL, PostgreSQL...).<\/p>\n\n\n\n<p>Come esempio di modellazione dei dati, diamo un&#039;occhiata alla tabella &quot;Studente&quot;, che ha gli attributi nome (stringa fino a venti caratteri), cognome (stringa fino a venti caratteri) e identificatore univoco (numero intero).&nbsp;<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/08\/image-9.png\" alt=\"\" class=\"wp-image-2538966\"\/><figcaption><sub>Tabella Studente (fonte propria)<\/sub><\/figcaption><\/figure><\/div>\n\n\n\n<p>In PostgreSQL, definiamo questa tabella come segue:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/08\/image-10.png\" alt=\"\" class=\"wp-image-2538968\"\/><figcaption><sub>Definizione della tabella Student in PostgreSQL (fonte propria)<\/sub><\/figcaption><\/figure>\n\n\n\n<p>Oltre alle definizioni dei tipi base di nome e cognome, richiediamo anche che non siano mai vuoti (NOT NULL). Il tipo SERIAL rappresenta un numero intero univoco, che nel nostro caso funge da chiave primaria dell&#039;Id. Per ogni entit\u00e0 aggiunta, viene determinata automaticamente in base all&#039;ID dell&#039;identit\u00e0 aggiunta in precedenza, che viene semplicemente incrementato.<\/p>\n\n\n\n<p>Tuttavia, \u00e8 molto pi\u00f9 semplice definire la tabella come classe nel codice sorgente della logica dell&#039;applicazione utilizzando un ORM che crea a sua volta l&#039;oggetto e i corrispondenti requisiti del database. Il tag Key sopra l&#039;attributo class indica la chiave primaria e Required indica che l&#039;attributo non deve essere vuoto.<\/p>\n\n\n\n<p>Dopo lo sviluppo, il framework EF Core ci consente di generare automaticamente uno schema di dati dal codice e distribuirlo nel database selezionato tramite gli strumenti da riga di comando inclusi nel framework. Le modifiche graduali allo schema del database vengono gestite attraverso queste migrazioni, che garantiscono che il database rimanga sincronizzato con il modello dati dell&#039;applicazione. Le nuove migrazioni, archiviate in EF Core sotto forma di classi speciali, vengono create confrontando il modello di dati corrente con lo schema del database corrente (stato dell&#039;ultima migrazione).<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/08\/image-11.png\" alt=\"\" class=\"wp-image-2538970\"\/><figcaption><em>Definizione della tabella Student utilizzando EF Core in ambiente .NET (origine propria)<\/em><\/figcaption><\/figure>\n\n\n\n<p>La connessione al database viene astratta da una classe che eredita dalla classe DbContext. I suoi attributi sono raccolte di entit\u00e0 di tipo DbSet mappate alle tabelle.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/08\/image-12.png\" alt=\"\" class=\"wp-image-2538972\"\/><figcaption><sub>Classe di connessione al database e tabella studenti definite (fonte propria)<\/sub><\/figcaption><\/figure>\n\n\n\n<p>Il suddetto framework per la scrittura delle query utilizza la sintassi LINQ, che rappresenta un modo unificato per recuperare ed elaborare dati da diverse fonti. La query viene quindi tradotta in SQL e il risultato stesso viene ricondotto in un oggetto, nel suo attributo o in una tabella di oggetti.<\/p>\n\n\n\n<p>L&#039;esempio seguente mostra una query per uno studente con un numero di iscrizione noto. \u00c8 sufficiente una sola chiamata al metodo Find con il valore della chiave primaria (ID).<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/08\/image-13.png\" alt=\"\" class=\"wp-image-2538974\"\/><figcaption><sub>Esempio di query per studenti con EF Core (origine propria)<\/sub><\/figcaption><\/figure>\n\n\n\n<p>Se vogliamo ottenere lo stesso risultato senza utilizzare uno strumento ORM, \u00e8 necessario molto pi\u00f9 codice. Viene mostrato un esempio che utilizza la libreria NpgSql. Per prima cosa dobbiamo creare oggetti che rappresentino la query SQL e leggano il database, mentre dobbiamo fare attenzione a includere correttamente il parametro per evitare possibili vulnerabilit\u00e0, come ad es. Iniezione SQL. Questa volta dobbiamo creare noi stessi l&#039;oggetto studente, ma dobbiamo stare attenti all&#039;ordine degli attributi nella query e alla possibilit\u00e0 di un errore nella query.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/08\/image-14.png\" alt=\"\" class=\"wp-image-2538976\"\/><figcaption><sub>Esempio di query per studenti utilizzando la libreria NpgSql (fonte propria)<\/sub><\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/08\/image-15.png\" alt=\"\" class=\"wp-image-2538978\"\/><figcaption><sub>Risposta alla domanda precedente (fonte propria)<\/sub><\/figcaption><\/figure>\n\n\n\n<p>La mappatura relazionale a oggetti ci offre quindi uno strato di astrazione che accelera notevolmente lo sviluppo del software grazie alla sua mappatura da un piano di sviluppo orientato agli oggetti, perch\u00e9 il codice SQL non ha bisogno di essere scritto separatamente dal codice sorgente (spesso orientato agli oggetti), un ORM ben scritto supporta buoni modelli e pratiche di sviluppo per la progettazione dell&#039;applicazione, consentendo allo stesso tempo agli sviluppatori non SQL di integrare pi\u00f9 facilmente un database relazionale nella loro applicazione.<\/p>\n\n\n\n<p>Tuttavia, \u00e8 importante sottolineare che l\u2019ORM non \u00e8 una soluzione perfetta. La debolezza sta proprio nell\u2019astrazione che ci offre. Genera molto pi\u00f9 codice SQL di quello che scriverebbe uno sviluppatore, il che pu\u00f2 influire notevolmente sulla velocit\u00e0 dell&#039;applicazione, pu\u00f2 nascondere cattive pratiche di accesso al database e costituisce un problema di compatibilit\u00e0 con le versioni precedenti. Sebbene il codice generato sia corretto nella maggior parte dei casi, \u00e8 comunque consigliabile controllarlo e testarlo manualmente.<\/p>\n\n\n\n<p>Il mapping relazionale degli oggetti \u00e8 una funzionalit\u00e0 non nativa dell&#039;ambiente .NET. La funzionalit\u00e0 \u00e8 fornita dalla maggior parte dei framework e delle librerie per linguaggi diversi. Esempi sono Django per Python, Gorm per Go, Spring per Java, Prisma per JavaScript (o Node.js)...<\/p>","protected":false},"excerpt":{"rendered":"<p>Autori: Denis Balant, Enej Hudobreznik Nonostante il rapido sviluppo della tecnologia, il linguaggio principale per la gestione dei database relazionali \u00e8 ancora SQL, o Structured Query Language, che, con i suoi numerosi derivati adattati (PostgreSQL, MySQL, ecc.), affonda le sue radici negli anni &#039;70. Scrivere query SQL si rivela spesso un lavoro che richiede molto tempo, soprattutto per i database pi\u00f9 complessi [\u2026]<\/p>","protected":false},"author":2,"featured_media":0,"comment_status":"","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[66],"tags":[],"class_list":["post-5308","post","type-post","status-publish","format-standard","hentry","category-programi"],"acf":{"subtitle":"Danes je svetovni splet najpopularnej\u0161a storitev najve\u010djega ra\u010dunalni\u0161kega omre\u017eja Internet. Vsak dan se mu pridru\u017ei preko 100 000 novih spletnih strani, ki segajo od stati\u010dnih z minimalno podporo interakcije do dinami\u010dnih, ki za izvajanje svojih funkcij potrebujejo veliko koli\u010dino a\u017eurnih podatkov. ","heading":"","summary":"Danes je svetovni splet najpopularnej\u0161a storitev najve\u010djega ra\u010dunalni\u0161kega omre\u017eja Internet. Vsak dan se mu pridru\u017ei preko 100 000 novih spletnih strani, ki segajo od stati\u010dnih z minimalno podporo interakcije do dinami\u010dnih, ki za izvajanje svojih funkcij potrebujejo veliko koli\u010dino a\u017eurnih podatkov.","thumbnail_small":"https:\/\/racunalniske-novice.com\/wp-content\/uploads\/2024\/08\/computer-560x315.jpg","thumbnail_large":"https:\/\/racunalniske-novice.com\/wp-content\/uploads\/2024\/08\/computer-1024x678.jpg","thumbnail_caption":"Fotografija je ilustrativna. (Foto: Pixabay)","gallery":"","video_gallery":null,"author":"","links":null,"sources":null,"skip_language":[]},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Objektno-relacijsko mapiranje z Entity Framework - Ra\u010dunalni\u0161ke novice<\/title>\n<meta name=\"description\" content=\"Danes je svetovni splet najpopularnej\u0161a storitev najve\u010djega ra\u010dunalni\u0161kega omre\u017eja Internet. Vsak dan se mu pridru\u017ei preko 100 000 novih spletnih strani, ki segajo od stati\u010dnih z minimalno podporo int\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/viva.racunalniske-novice.com\/it\/wp-json\/wp\/v2\/posts\/5308\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Objektno-relacijsko mapiranje z Entity Framework - Ra\u010dunalni\u0161ke novice\" \/>\n<meta property=\"og:description\" content=\"Avtorja: Denis Balant, Enej Hudobreznik Kljub hitremu razvoju tehnologije pa je glavni jezik za upravljanje z relacijskimi podatkovnimi bazami \u0161e vedno SQL oz. strukturirani poizvedbeni jezik, ki ima z mnogimi prilagojenimi izpeljankami (PostgreSQL, MySQL \u2026) korenine \u017ee v 70. letih prej\u0161njega stoletja.&nbsp; Pisanje SQL-poizvedb se pogosto izka\u017ee za dokaj zamudno delo, \u0161e posebej pri kompleksnej\u0161i [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/viva.racunalniske-novice.com\/it\/mappatura-relazionale-degli-oggetti-con-il-framework-delle-entita\/\" \/>\n<meta property=\"og:site_name\" content=\"Ra\u010dunalni\u0161ke novice\" \/>\n<meta property=\"article:published_time\" content=\"2024-08-20T11:34:07+00:00\" \/>\n<meta name=\"author\" content=\"sinusiks\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"sinusiks\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/viva.racunalniske-novice.com\/objektno-relacijsko-mapiranje-z-entity-framework\/\",\"url\":\"https:\/\/viva.racunalniske-novice.com\/objektno-relacijsko-mapiranje-z-entity-framework\/\",\"name\":\"Objektno-relacijsko mapiranje z Entity Framework - Ra\u010dunalni\u0161ke novice\",\"isPartOf\":{\"@id\":\"https:\/\/viva.racunalniske-novice.com\/en\/#website\"},\"datePublished\":\"2024-08-20T11:34:07+00:00\",\"dateModified\":\"2024-08-20T11:34:07+00:00\",\"author\":{\"@id\":\"https:\/\/viva.racunalniske-novice.com\/en\/#\/schema\/person\/afb62e36efa34516d50249517e4cdbb4\"},\"breadcrumb\":{\"@id\":\"https:\/\/viva.racunalniske-novice.com\/objektno-relacijsko-mapiranje-z-entity-framework\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/viva.racunalniske-novice.com\/objektno-relacijsko-mapiranje-z-entity-framework\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/viva.racunalniske-novice.com\/objektno-relacijsko-mapiranje-z-entity-framework\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/viva.racunalniske-novice.com\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Objektno-relacijsko mapiranje z Entity Framework\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/viva.racunalniske-novice.com\/en\/#website\",\"url\":\"https:\/\/viva.racunalniske-novice.com\/en\/\",\"name\":\"Ra\u010dunalni\u0161ke novice\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/viva.racunalniske-novice.com\/en\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/viva.racunalniske-novice.com\/en\/#\/schema\/person\/afb62e36efa34516d50249517e4cdbb4\",\"name\":\"sinusiks\",\"sameAs\":[\"https:\/\/ml.racunalniske-novice.com\"],\"url\":\"https:\/\/viva.racunalniske-novice.com\/it\/author\/sinusiks\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Objektno-relacijsko mapiranje z Entity Framework - Ra\u010dunalni\u0161ke novice","description":"Danes je svetovni splet najpopularnej\u0161a storitev najve\u010djega ra\u010dunalni\u0161kega omre\u017eja Internet. Vsak dan se mu pridru\u017ei preko 100 000 novih spletnih strani, ki segajo od stati\u010dnih z minimalno podporo int","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/viva.racunalniske-novice.com\/it\/wp-json\/wp\/v2\/posts\/5308","og_locale":"it_IT","og_type":"article","og_title":"Objektno-relacijsko mapiranje z Entity Framework - Ra\u010dunalni\u0161ke novice","og_description":"Avtorja: Denis Balant, Enej Hudobreznik Kljub hitremu razvoju tehnologije pa je glavni jezik za upravljanje z relacijskimi podatkovnimi bazami \u0161e vedno SQL oz. strukturirani poizvedbeni jezik, ki ima z mnogimi prilagojenimi izpeljankami (PostgreSQL, MySQL \u2026) korenine \u017ee v 70. letih prej\u0161njega stoletja.&nbsp; Pisanje SQL-poizvedb se pogosto izka\u017ee za dokaj zamudno delo, \u0161e posebej pri kompleksnej\u0161i [&hellip;]","og_url":"https:\/\/viva.racunalniske-novice.com\/it\/mappatura-relazionale-degli-oggetti-con-il-framework-delle-entita\/","og_site_name":"Ra\u010dunalni\u0161ke novice","article_published_time":"2024-08-20T11:34:07+00:00","author":"sinusiks","twitter_card":"summary_large_image","twitter_misc":{"Scritto da":"sinusiks","Tempo di lettura stimato":"4 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/viva.racunalniske-novice.com\/objektno-relacijsko-mapiranje-z-entity-framework\/","url":"https:\/\/viva.racunalniske-novice.com\/objektno-relacijsko-mapiranje-z-entity-framework\/","name":"Objektno-relacijsko mapiranje z Entity Framework - Ra\u010dunalni\u0161ke novice","isPartOf":{"@id":"https:\/\/viva.racunalniske-novice.com\/en\/#website"},"datePublished":"2024-08-20T11:34:07+00:00","dateModified":"2024-08-20T11:34:07+00:00","author":{"@id":"https:\/\/viva.racunalniske-novice.com\/en\/#\/schema\/person\/afb62e36efa34516d50249517e4cdbb4"},"breadcrumb":{"@id":"https:\/\/viva.racunalniske-novice.com\/objektno-relacijsko-mapiranje-z-entity-framework\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/viva.racunalniske-novice.com\/objektno-relacijsko-mapiranje-z-entity-framework\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/viva.racunalniske-novice.com\/objektno-relacijsko-mapiranje-z-entity-framework\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/viva.racunalniske-novice.com\/en\/"},{"@type":"ListItem","position":2,"name":"Objektno-relacijsko mapiranje z Entity Framework"}]},{"@type":"WebSite","@id":"https:\/\/viva.racunalniske-novice.com\/en\/#website","url":"https:\/\/viva.racunalniske-novice.com\/en\/","name":"Ra\u010dunalni\u0161ke novice","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/viva.racunalniske-novice.com\/en\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"it-IT"},{"@type":"Person","@id":"https:\/\/viva.racunalniske-novice.com\/en\/#\/schema\/person\/afb62e36efa34516d50249517e4cdbb4","name":"sinusiks","sameAs":["https:\/\/ml.racunalniske-novice.com"],"url":"https:\/\/viva.racunalniske-novice.com\/it\/author\/sinusiks\/"}]}},"_links":{"self":[{"href":"https:\/\/viva.racunalniske-novice.com\/it\/wp-json\/wp\/v2\/posts\/5308","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/viva.racunalniske-novice.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/viva.racunalniske-novice.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/viva.racunalniske-novice.com\/it\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/viva.racunalniske-novice.com\/it\/wp-json\/wp\/v2\/comments?post=5308"}],"version-history":[{"count":0,"href":"https:\/\/viva.racunalniske-novice.com\/it\/wp-json\/wp\/v2\/posts\/5308\/revisions"}],"wp:attachment":[{"href":"https:\/\/viva.racunalniske-novice.com\/it\/wp-json\/wp\/v2\/media?parent=5308"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/viva.racunalniske-novice.com\/it\/wp-json\/wp\/v2\/categories?post=5308"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/viva.racunalniske-novice.com\/it\/wp-json\/wp\/v2\/tags?post=5308"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}