LINQ to SQL vběhl do našich zdrojových kódů stejně rychle jako generické kolekce v předchozí verzi frameworku. Nyní s příchodem první bety prvního opravného balíčku pro Visual Studio 2008 resp. .NET Framework 3.5 si mnozí všimli Entity Frameworku, především díky nové položce v nabídce souborů Visual Studia.
Bohužel tento nový prvek přinesl mnoho zmatení v tom, co je Entity Framework a jak to celé zapadá dohromady s LINQ to SQL.
Abychom pochopili, kam obě technologie směřují a jak se liší, je třeba poznat jejich společné a odlišné rysy – alespoň ty hlavní (marginální odlišnosti nás v tomto článku nezajímají).
reklama
LINQ to SQL vběhl do našich zdrojových kódů stejně rychle jako generické kolekce v předchozí verzi frameworku. Nyní s příchodem první bety prvního opravného balíčku pro Visual Studio 2008 resp. .NET Framework 3.5 si mnozí všimli Entity Frameworku, především díky nové položce v nabídce souborů Visual Studia.
Bohužel tento nový prvek přinesl mnoho zmatení v tom, co je Entity Framework a jak to celé zapadá dohromady s LINQ to SQL.
Abychom pochopili, kam obě technologie směřují a jak se liší, je třeba poznat jejich společné a odlišné rysy – alespoň ty hlavní (marginální odlišnosti nás v tomto článku nezajímají).
LINQ neLINQ …
První co je třeba si ujasnit, je technologie LINQ neboli Language INtegrated Query. LINQ to SQL totiž není nic jiného než jeden ze střípků mozaiky, které nový .NET Framework přinesl. Stejně jako je LINQ to XML, LINQ to IEnumerable apod., existuje LINQ to SQL. Daný kód je při kompilaci přeložen (za pomoci dalších informací, především v *.dbml souboru) do těch správných volání ADO.NET tříd/metod a přidána je materializace výsledku do podoby objektů. Vlastní Entity Framework také LINQ podporuje ve formě LINQ to Entities. Jak vidíme, zde se nám obě technologie prolínají.
Mapování nemapování …
Podíváme-li se na to, co nám LINQ v podobě mapování nabízí, najdeme již jisté odlišnosti. První věc, které upoutá především „alternativní“ skupinu vývojářů (čti vývojáři nepoužívající MS SQL) je nemožnost LINQ to SQL pro jejich oblíbenou databázi použít. LINQ to SQL můžete použít pouze pro MS SQL 2000 a vyšší.
Další odlišností je již vlastní mapování. Neexistuje něco jako konceptuální model, který je mapován na fyzickou strukturu. LINQ to SQL vždy mapuje jednu tabulku na jeden objekt (výjimka v podobě dědičnosti bude zmíněna záhy). Výsledek je tedy něco jako silně typovaná 1:1 vrstva nad databází. Naproti tomu Entity Framework je plnohodnotný objektově-relační mapper (jako např. známý nHibernate). Strukturu vašeho světa si vytvoříte v konceptuálním modelu a do fyzického modelu jej transformujete pomocí mapování (mapovacího souboru). Výhodou a zároveň velkou odlišností je možnost měnit mapování na fyzický model beze změny konceptuálního modelu – při např. denormalizaci databáze. Jakákoli změna v databázi může v případě LINQ to SQL znamenat nefunkčnost a nutnost změn.
Entity Framework navíc nabízí např. podporu komplexních typů, přímou podporu pro M:N vazby apod.
Dědit nedědit …
Výše uvedená zmínka o výjimce v podobě dědičnosti nás přivádí k další odlišnosti. Zatímco LINQ to SQL podporuje pouze TPH princip vyjádření dědičnosti v relačních databázích. V kontrastu se všemi třemi běžnými metodami [viz Dědičnost v relačních databázích], které Entity Framework podporuje, to působí trochu jako chudý příbuzný.
Skládat neskládat …
Poslední přednost, kterou Entity Framework má a kterou zmíním, je podpora pro skládání příkazů jako řetězce. Velmi často je totiž v aplikaci potřeba např. vyhledávací podmínky vytvářet na základě zadání od uživatele. Entity Framework vám nabízí možnost pomocí EntityCommand ponořit se velmi blízko standardnímu psaní jako v případě ADO.NET či pomocí CreateQuery vytvořit dotaz skládáním řetězců, ale dále pokračovat striktně objektově. V LINQ to SQL toto chování bude simulovat obtížně (i když to není nemožné).
Není to tak jednoduché …
Ačkoli by se z předchozích odstavců mohlo zdát, že LINQ to SQL je jen narychlo spíchnutá technologie a Entity Framework jej v každém ohledu válcuje, určitě tušíte, že svět není tak černobílý. Díky těsné vazbě LINQ to SQL s MS SQL, tedy vše z „kuchyně“ Microsoftu, nabízí LINQ to SQL mnohem bohatší výsledný vygenerovaný kód. V rámci Entity Frameworku je výsledek po vygenerování chudší a je nutné si další metody/události dopsat sám (a víme, jak jsou vývojáři líní).
Dalším aspektem, který nemůžeme opomenout je právě jednoduchost LINQ to SQL. Většina malých vývojářských týmů používá databáze jako chytrá úložiště (jsou plně spokojeni s pouhým odstíněním od ukládání dat) bez většího zapojení prostředků dané platformy do celého procesu zpracování a uchovávání dat. Tento stav světa hraje také do karet do LINQ to SQL.
Pokud však vyvíjíte aplikaci, u které je předpoklad dalšího rozvoje, je Entity Framework je ta správná cesta. Pro rychlý vývoj aplikace však není ani LINQ to SQL špatnou volbou.
Co si myslíte o Entity Frameworku Vy? Jak vidíte budoucnost LINQ to SQL?