Entity Framework vs LINQ to SQL




Nyní, když .NET v3.5 SP1 byl propuštěn (spolu s VS2008 SP1), nyní máme přístup do rámce .NET entity.


Moje otázka je tato. Když se snažíte rozhodnout mezi použitím Entity Framework a LINQ to SQL jako ORM, jaký je v tom rozdíl?


Jak jsem pochopil, Entity Framework (při použití LINQ k entity) je ‚velký bratr‘, aby LINQ to SQL? Je-li to váš případ - jaké výhody to má? Co to může dělat, že LINQ pro SQL nemůže dělat sama o sobě?
LINQ pro SQL podporuje pouze 1 až 1 mapování databázových tabulek, pohledy, sprocs a funkce jsou k dispozici v Microsoft SQL Server. Je to skvělý API použít k rychlému přístupu k datům konstrukci poměrně dobře navržených databází SQL Server. LINQ2SQL byla poprvé vydána s C # 3.0 a .NET Framework 3.5.


LINQ k entity (ADO.Net Entity Framework) je ORM (Object relační Mapper) API, které umožňuje širokou definici modelů objekt domény a jejich vztah k mnoha různým poskytovatelům ADO.Net dat. Jako takový, můžete kombinovat několik různých databázových, aplikačních serverů nebo protokoly navrhnout agregovaný mash-up objektů, které jsou konstruovány z různých tabulek, zdroje, služby atd Framework ADO.Net byl propuštěn s .NET Framework 3.5 SP1.


To je dobrý úvodní článek na webu MSDN:
 [Představujeme LINQ pro relační data](http://msdn.microsoft.com/en-us/library/cc161164.aspx)
<p>už nemůžu najít ten pravý příspěvek, ale eric lippert (a možná i několik dalších softies) se při několika příležitostech opíral o to, jak je linq <strong>deklarativní</strong>, což je pro několik tříd problémů mnohem intuitivnější než <strong>imperativní</strong> syntaxe.</p><p>linq umožňuje psát kód, který vyjadřuje <em> záměr </em>, nikoli mechanismus <em> </em> .</p><p>řekni mi, co je lépe čitelné. tento:</p><pre class="lang-cs prettyprint-override"><code>ienumerable&lt;customer&gt; getvipcustomers(ienumerable&lt;customer&gt; source) { list&lt;customer&gt; results = new list&lt;customer&gt;(); foreach (customer c in source) { if (c.firstname == "aaron") { results.add(c); } } results.sort(new lastnamecomparer()); return results; } class lastnamecomparer : icomparer&lt;customer&gt; { public int compare(customer a, customer b) { return x.lastname.compareto(b.lastname); } } </code></pre><p>nebo toto?</p><pre class="lang-cs prettyprint-override"><code>ienumerable&lt;customer&gt; getvipcustomers(ienumerable&lt;customer&gt; source) { return from c in source where c.firstname == "aaron" orderby c.lastname select c; } </code></pre><p>nebo dokonce tohle?</p><pre class="lang-cs prettyprint-override"><code>ienumerable&lt;customer&gt; getvipcustomers(ienumerable&lt;customer&gt; source) { return source.where(c =&gt; c.firstname == "aaron").orderby(c =&gt; c.lastname); } </code></pre><p>prvním příkladem je jen svazek zbytečných kotlových desek, aby bylo dosaženo co nejjednodušších výsledků. každý, kdo si myslí, že je <em> více </em> čitelnější než verze linq, musí nechat vyšetřit hlavu. nejen to, ale první ztrácí paměť. nemůžete to ani napsat pomocí <code>yield return</code> kvůli třídění.</p><p>váš spolupracovník může říct, co chce; osobně si myslím, že linq nezměřitelně zlepšil <em> můj </em> kód čitelnosti.</p><p>ani o linqovi není nic „relačního“. může mít některé povrchové podobnosti s sql, ale nepokouší se v jakémkoli tvaru nebo formě implementovat relační počet. je to jen banda rozšíření, která usnadňují vyhledávání a projektování sekvencí. „dotaz“ neznamená „relační“ a ve skutečnosti existuje několik nerelačních databází, které používají syntaxi podobnou sql. linq je <em> čistě </em> objektově orientovaný, prostě se stává, že pracuje s relačními databázemi prostřednictvím frameworků jako linq do sql kvůli nějakému výrazu voodoo stromů a chytrému designu od tým c #, čímž se anonymní funkce implicitně převádějí na stromy výrazů.</p> V současné době jsou v kurzu SQL dartabáze. Takže pokud se chceš uplatnit, tak MS-SQL, Interbase, ORACLE, popř. nějaké ty internetové jako např. MySQL, PostgreeSQL apod. Každá databáze má vlastní programovací jazyk pro uložené procedury, vlastní datové typy apod.Program, ve kterém budeš vyvíjet soft je opět něco jiného. Ten většinou je univerzální a umí přistupovat k jakékoliv databázi.V současné době, pokud bych začínal, tak bych se orientoval směrem .NET a C#. <p>je to velmi užitečné v každém scénáři, kde je jedna část třídy generována nějakým vlastním nástrojem, protože umožňuje přidat vlastní logiku do vygenerovaného kódu bez zdědění generované třídy. mimochodem. ze stejného důvodu existují také částečné metody.</p><p>nejde jen o uživatelské rozhraní, ale také o jiné technologie, jako je linq-to-sql nebo entity framework.</p> LN je jednoznacne lepsi nez exchange. Sdileni dokumentu ... nema chybu. Jejich komunikator ST je s MS comunikatorem nebo Lync absolutne nesrovnatelny. Ten MS "shit" funguje podle pocasi.. Ono na spravu je domino peklo (na zacatku), ale po nasazeni jede jak "ma". A LN klient, no to si uzivatele celkem rychle zvyknou <p>entityfieldquery používá sadu háčků k propojení s moduly úložiště pole, jako je například pole sql storage, aby pracovalo pro pole i další vlastnosti uzlu. dlouhodobě je entityfieldquery mnohem spolehlivější způsob dotazování na jakýkoli typ entity av některých situacích může provádět dotazy na více entit (viz <a href="http://api.drupal.org/api/drupal/modules--field--field.module/function/field\_has\_data/7">field\_has\_data</a> nebo <a href="http://api.drupal.org/api/drupal/modules--field--modules--list--list.module/function/\_list\_values\_in\_use/7">\_ list\_values\_in\_use ()</a> pro příklad.</p><p>zde je jednoduchý příklad použití entityfieldquery k získání seznamu všech uzlů publikovaných před konkrétním časovým razítkem:</p><pre><code>$query = new entityfieldquery(); $query -&gt;entitycondition('entity\_type', 'node', '=') -&gt;propertycondition('status', 1, '=') -&gt;propertycondition('created', '1294694496', '&lt;'); $result = $query-&gt;execute(); </code></pre><p>$ výsledky z tohoto dotazu by vypadaly asi takto:</p><pre><code>array ( [node] =&gt; array ( [1] =&gt; stdclass object ( [nid] =&gt; 1 [vid] =&gt; 49 [type] =&gt; article ) [2] =&gt; stdclass object ( [nid] =&gt; 2 [vid] =&gt; 2 [type] =&gt; page ) ) ) </code></pre><p>toto pole byste pak mohli použít jako vstup pro node\_load\_multiple:</p><pre><code>$nodes = node\_load\_multiple(array\_keys($result['node'])); </code></pre> <p>jako uživatel 100% foss bych rád řekl ano:</p><p>funguje to však dobře, dokud si neuvědomíte, že knihovna je implementována napůl a je nová a skvělá a byla by opravdu užitečná (jako příklad linq to sql)</p> ORM může být váš nejlepší řešení.   

Nebo použít typ úložiště vzor, s „thingContext“ objekt, který je zodpovědný za státní vytrvalost.


Osobně používám Active Record, kde ušetřit logiku se peče do základní třídy, ale já odjíždím to ve prospěch NHibernate stylu úložiště vzor. Příspěvek na DDD a testování věci bez db je velmi příjemné mít v rámcové typu situace, kdy je moje obchodní logiky nyní získává trakci na novém uživatelském rozhraní. Použito v malém rozsahu pro evidenci ve vlastním podnikání. Vyzkoušej, je trochu jiný než Acces ale nemá špatné možnosti. Pokud chceš ještě více funkcionality, můžeš zkusit lokální instalaci mysql serveru a LOB použít jako klienta. <p>vyvinul jsem skutečné aplikace s oběma rails a asp.net mvc), ale tato odpověď přichází se značnou výzvou: naučil jsem se a vyvíjel se s předběžnou verzí 2 rails, takže je zcela možné, že jsem jsem nesmírně zastaralý díky mým znalostem rails).</p><p>jak už bylo řečeno, nemyslím si, že existuje <em> cokoli </em>, které lze s jedním, ale ne s druhým. vzhledem k jakémukoli souboru požadavků na webovou aplikaci byste měli být schopni sestavit tuto aplikaci - pravděpodobně stejně efektivně - pomocí rails nebo asp.net mvc).</p><p>existuje několik úhledných věcí, které - podle mého nejlepšího vědomí - jsou k dispozici v asp.net mvc hlavně kvůli aspektům c # /. net. například: když mám stránku, která obsahuje odeslaný formulář, mám akci, která zkontroluje, zda se jedná o get, nebo post), abych rozhodla, co dělat:</p><pre><code>def edit @item = item.find(params[:id]) if request.post? @item.update\_attributes(params[:item]) redirect\_to :action =&gt; 'edit', :id =&gt; @item.id end end </code></pre><p>toto je triviální příklad, ale <code>if request.post?</code> vzor je v rails velmi běžný. v netriviálních případech může být kód akce velký a chaotický a často bych si přál, abych ho mohl čistě promítnout do samostatných metod. v asp.net mvc to mohu udělat:</p><pre><code>public actionresult edit() { // render my page that has the edit form ... } [httppost] public actionresult edit(foothing foo) { // save my foothing data ... } </code></pre><p>myslím, že schopnost čistě oddělit vyřizování žádostí get a post žádostí) je elegantní. váš počet najetých kilometrů se může lišit.</p><p>další věc, kterou asp.net mvc dělá, že je super v pohodě (opět podle mého názoru), souvisí také s manipulací s posts. v rails musím dotazovat <code>params</code> hash pro všechny mé proměnné formuláře. řekněme, že mám formulář s poli „status“, „gonkulated“, „invert“ a „dispozice“:</p><pre><code>def edit @item = item.find(params[:id]) if params[:status] == "new" ... else ... end if params[:gonkulated] == "true" ... else ... end if params[:invert] == "true" ... else ... end # rest ommited for brevity end </code></pre><p>ale asp.net mvc úhledně mi umožňuje získat všechny hodnoty formuláře jako parametry mé metody akce:</p><pre><code>[httppost] public actionresult edit(int id, string status, bool gonkulated, bool invert, int disposition) { ... } </code></pre><p>to jsou dvě věci, které se mi na asp.net mvc nebo rails opravdu líbily. <strong><em> nestačí, aby si nějaký rozumný nebo kompetentní vývojář vybral jeden rámec nad druhým. </em></strong></p> <p>před pár minutami jsem to kontroloval: <a href="http://blog.cherouvim.com/a-table-that-should-exist-in-all-projects-with-a-database/">tabulka, která by měla existovat ve všech projektech s databází</a> , se zdá být dost jednoduchá na to, aby se dala do praxe, podívejte se na to:</p><blockquote> <p>říká se tomu schema\_version (nebo migrace nebo cokoli vám vyhovuje) a jeho účelem je sledovat strukturální nebo datové změny v databázi. možná struktura (příklad v mysql) je:</p> <pre><code>create table schema\_version ( `when` timestamp not null default current\_timestamp, `key` varchar(256) not null, `extra` varchar(256), primary key (`key`) ) engine=innodb; </code></pre> <p>vložte do hodnot schema\_version (<code>key</code>, <code>extra</code>) ('001', 'verze schématu');</p> <p>ať už přidáte tuto tabulku od začátku projektu nebo ihned po nasazení první verze na pracovní nebo produkční server, je jen na vás.</p> <p>kdykoli potřebujete provést skript sql, abyste změnili strukturu databáze nebo provedli migraci dat, měli byste do této tabulky přidat také řádek. a udělejte to prostřednictvím příkazu insert na začátku nebo na konci tohoto skriptu (který je zavázán do úložiště kódu projektu).</p> <p>…</p> </blockquote>