<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Luca Mellano &#187; LINQ</title>
	<atom:link href="http://www.lucamellano.com/category/linq/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.lucamellano.com</link>
	<description></description>
	<lastBuildDate>Tue, 03 Aug 2010 09:16:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Le differenze tra LINQ to SQL e LINQ to Entities</title>
		<link>http://www.lucamellano.com/le-differenze-tra-linq-to-sql-e-linq-to-entities/</link>
		<comments>http://www.lucamellano.com/le-differenze-tra-linq-to-sql-e-linq-to-entities/#comments</comments>
		<pubDate>Mon, 10 Nov 2008 17:18:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[LINQ]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[LINQ to Entities]]></category>
		<category><![CDATA[LINQ to SQL]]></category>
		<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">http://www.lucamellano.com/?p=85</guid>
		<description><![CDATA[Spinto dalla curiosità e dalla necessità, ho deciso di postare le interessanti differenze tra questi due approcci ai dati presenti nel framework .NET 3.5: LINQ to SQL e LINQ to Entities.
Di seguito potrete trovare il link all&#8217;esempio illustrato:
http://community.ugiss.org/files/folders/files/entry3031.aspx
LINQ to SQL è una delle implementazioni di LINQ che sono state rilasciate con Visual Studio 2008. LINQ [...]]]></description>
			<content:encoded><![CDATA[<p>Spinto dalla curiosità e dalla necessità, ho deciso di postare le interessanti differenze tra questi due approcci ai dati presenti nel framework .NET 3.5: LINQ to SQL e LINQ to Entities.</p>
<p>Di seguito potrete trovare il link all&#8217;esempio illustrato:</p>
<p><a href="http://community.ugiss.org/files/folders/files/entry3031.aspx" target="_blank">http://community.ugiss.org/files/folders/files/entry3031.aspx</a></p>
<p><strong>LINQ to SQL</strong> è una delle implementazioni di LINQ che sono state rilasciate con Visual Studio 2008. LINQ to SQL è il modo più semplice per poter lavorare con SQL Server usando un nuovo modello di programmazione in C# 3.0 e Visual Basic 9. In questo modo nel nostro linguaggio .NET preferito scriviamo del codice che si avvicina ad una sintassi SQL rendendo di fatto meno complicato far &#8220;parlare&#8221; le nostre applicazioni fatte di classi, clicli e quant&#8217;altro con SQL Server, un DBMS relazionale in cui &#8220;vediamo&#8221; solo tabelle. Con LINQ to SQL in sostanza mappiamo uno a uno le tabelle di SQL Server con delle classi e grazie al framework messo a disposizione siamo in grado di fare le classiche operazioni di Insert, Update, Delete e Query.</p>
<p><strong>LINQ to Entities</strong> è un&#8217;altra implementazione di LINQ fatta per parlare con l&#8217; ADO.NET Entity Framework (EF), sia l&#8217;EF che LINQ to Entities sono attualmente in Beta 3. L&#8217;EF è un framework che consentirà agli sviluppatori di lavorare con un maggior livello di astrazione; cioè uno sviluppatore si concentrerà solo sul modello <em>concettuale</em> proprio del modello Entità-Relazione, in maniera indipendente dallo storage sottostante sia esso SQL Server o un altro database. Ad esempio potrò lavorare con un&#8217; entità Cliente che potrà mapparsi su uno storage relazione anche su più di una tabella.</p>
<p><span id="more-85"></span></p>
<p>Da questa rapida descrizione emerge almeno una considerazione.</p>
<ul>
<li>Il modello ad oggetti usato con EF è diverso da quello usato dal designer di Visual Studio per LINQ to SQL. Possiamo infatti lavorare usando l&#8217;EF con relazioni molti-a-molti. Ad esempio possiamo pensare di avere una relazione del tipo autori-libri (cioè un autore può aver scritto più libri e un libro può essere scritto da più autori). Nell&#8217;esempio seguente il concetto sarà più chiaro.</li>
</ul>
<p>ok, vediamo di chiarirci meglio le idee sul codice partendo dall&#8217;esempio, in cui trovate lo stesso database utilizzato prima in un progetto che usa LINQ to SQL e poi uno che usa LINQ to Entities e quindi l&#8217;EF.</p>
<h3>Il Database</h3>
<p>Il nostro database potrebbe essere un semplice modello per rappresentare la realtà di un&#8217;ipotetica biblioteca, dove un utente[tabella Users] può prendere in prestito [tabella Loans] un libro. Dal punto di vista del nostro esempio ci interessano però le altre tre tabelle quella dei libri [tabella Books] e quella degli autori [Authors]. Che se concettualmente rappresentano una <strong>relazione molti-a-molti</strong>,dal punto di vista di un database relazione sono mappati come in figura con relazioni uno-a-molti e molti-a-uno, quindi si usa la tebella di &#8220;appoggio&#8221; BooksAuthors per mantenere le corrette relazioni.</p>
<p style="text-align: center;"><a href="http://www.lucamellano.com/wp-content/uploads/image_6.png"><img class="alignnone size-medium wp-image-88" title="image_6" src="http://www.lucamellano.com/wp-content/uploads/image_6-300x251.png" alt="" width="300" height="251" /></a></p>
<p>Vedremo ora come si comporta il designer di Visual Studio 2008 per creare delle classi su questo database e poi vedremo  come usare EF.</p>
<h3>Designer di Visual Studio 2008</h3>
<p>Il designer di Visual Studio 2008 ci dà un grande aiuto nel creare le classi, che potremmo creare anche a mano e che di fatto rappresentano il nostro modello applicativo. Se guardate la figura seguente che è il risultato di tale procedura vi accorgerete che le tre tabelle del nostro database sono state mappate uno a uno con le classi che useremo poi nella nostra applicazione.</p>
<p>Nella figura seguente notate il designer delle classi:</p>
<p style="text-align: center;"><a href="http://www.lucamellano.com/wp-content/uploads/image_10.png"><img class="alignnone size-medium wp-image-89" title="image_10" src="http://www.lucamellano.com/wp-content/uploads/image_10-300x294.png" alt="" width="300" height="294" /></a></p>
<h3>Usiamo LINQ to SQL</h3>
<p>Avendo tre classi, che fanno parte del nostro DataContext specializzato, cioè della classe con cui ci interfacciamo a livello di codice per fare le operazioni di query,insert, update e delete, se vogliamo inserire un libro scritto da due autori dobbiamo in LINQ to SQL scrivere il codice seguente:</p>
<p style="text-align: center;"><a href="http://www.lucamellano.com/wp-content/uploads/image_12.png"><img class="alignnone size-medium wp-image-90" title="image_12" src="http://www.lucamellano.com/wp-content/uploads/image_12-300x202.png" alt="" width="300" height="202" /></a></p>
<p style="text-align: left;">In buona sostanza una classe Book, due classi Authors e due classi BookAuthors per mantenere le relazioni. Il codice SQL che viene mandato a SQL Server è il seguente:</p>
<p style="text-align: left;"><a href="http://www.lucamellano.com/wp-content/uploads/image_14.png"><img class="aligncenter size-medium wp-image-91" title="image_14" src="http://www.lucamellano.com/wp-content/uploads/image_14-300x225.png" alt="" width="300" height="225" /></a></p>
<p style="text-align: left;">Quello che succede sul database è quello che ci aspettiamo, viene inserito il primo libro poi il primo autore, quindi avendo l&#8217;id generato per l&#8217;autore viene inserito un record nella tabella BooksAuthors, per mantenere il legame logico molti-a-molti tra autori e libri.</p>
<p style="text-align: left;">
<h3>Designer dell&#8217; Entity Framework (EF)</h3>
<p>Se usiamo il designer dell&#8217; EF, attualmente in <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=D8AE4404-8E05-41FC-94C8-C73D9E238F82&amp;displaylang=en" target="_blank">CTP 2</a>, vediamo come possiamo descrivere il nostro modello applicativo. Ecco che dall&#8217;esempio in questione notiamo subito una cosa interessante: cioè nonostante il database sia quello dell&#8217;esempio precedente, possiamo mappare relazioni molti-a-molti come mostrato in figura:</p>
<p><a href="http://www.lucamellano.com/wp-content/uploads/image_16.png"><img class="aligncenter size-medium wp-image-93" title="image_16" src="http://www.lucamellano.com/wp-content/uploads/image_16-282x300.png" alt="" width="282" height="300" /></a></p>
<p>Nella nostra applicazione avremo una classe Book ed una Authors da utilizzare, non più come in precedenza la classe di appoggio. A livello di designer la differenza è che abbiamo mappato la relazione molti-a-molti (**)  sulla tabella di appoggio BooksAuthors.</p>
<h3>Usiamo LINQ to Entities</h3>
<p>A questo punto usiamo LINQ to Entities per lavorare e inserire un libro associato a due autori. Spero sia chiaro la semplificazione delle istruzioni LINQ che seguono, solo legate alla differenza di approccio <em>concettuale</em> nella strutturazione delle classi. Questo è una delle differenze quando si usa l&#8217;EF. Avrei potuto anche mappare il mio database uno-a-uno come fatto con l&#8217;esempio di LINQ to SQL, questo è quello che farebbe in automatico il designer se importassimo direttamente il database.</p>
<p><a href="http://www.lucamellano.com/wp-content/uploads/image_18.png"><img class="aligncenter size-medium wp-image-94" title="image_18" src="http://www.lucamellano.com/wp-content/uploads/image_18-300x88.png" alt="" width="300" height="88" /></a></p>
<h2>Conclusione</h2>
<p>Nel post avete visto il diverso approccio usato da EF, LINQ to Entities e LINQ to SQL per affrontare un database semplice come quello presentato. L&#8217;esempio tende a porre l&#8217;attenzione sul supporto di relazioni molti-a-molti. Questa non è l&#8217;unica differenza tra le due implementazioni di LINQ, ma è a mio parere quella più significativa.</p>
<p>EF permette di descrivere il proprio modello applicativo pensando al Modello Entità-Relazioni. E&#8217; possibile mappare poi il modello creato, sulle tabelle del database relazionale sottostante (sia esso SQL Server o un altro <a href="http://www.microsoft.com/presspass/press/2007/dec07/12-06EntityBeta3PR.mspx" target="_blank">DBMS di quelli che saranno supportati dall &#8216;EF</a>). L&#8217;architettura realizzata si basa sull&#8217;uso di tre file XML, che in questo post non ho descritto e la cui complessità è nascosta dal Designer. In generale EF sarà più adatto (al momento come vi dicevo è in Beta 3, mentre il designer usato è in CTP) ad ambienti in cui viene richiesto il supporto a database diversi da SQL Server e in cui l&#8217;evolzione del database stesso avviene spesso ad opera di persone diverse da quelle che scrivono le applicazioni. In questi scenari è tipico avere un elevato numero di tabelle che rappresentano logicamente un&#8217;entità (Cliente ad esempio) o relazione di ereditarietà tra queste (Persone e Cliente).</p>
<p>LINQ to SQL rappresenta la giusta soluzione per realizzare applicazioni RAD o per realizzare applicazioni in cui il mapping più sofisticato di EF non è necessario, in questo scenario LINQ to SQL rappresenta il modo più rapido di lavorare con LINQ e SQL Server.</p>
<p>Vi consiglio la lettura di <a href="http://www.code-magazine.com/article.aspx?quickid=990712062&amp;page=2" target="_blank">questo articolo (in Inglese)</a> per ulteriori approfondimenti e spero che questo post sia almeno parzialmente utile a capire il diverso contesto di utilizzo delle due implementazioni di LINQ.</p>
<p style="text-align: left;">
<p style="text-align: left;">
]]></content:encoded>
			<wfw:commentRss>http://www.lucamellano.com/le-differenze-tra-linq-to-sql-e-linq-to-entities/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
