410 likes | 663 Views
Entity Framework. Török János Zsolt torokjzsolt @ gmail.com. Agenda. Élet az EF előtt Entity Framework bemutatása Az Entity Data Model Programozási koncepciók További mappelési lehetőségek Hogyan tovább. Az alapprobléma. Alkalmazásokat írunk
E N D
Entity Framework Török János Zsolt torokjzsolt@gmail.com
Agenda • Élet az EF előtt • Entity Framework bemutatása • Az Entity Data Model • Programozási koncepciók • További mappelési lehetőségek • Hogyan tovább
Az alapprobléma • Alkalmazásokat írunk • Ezek mind relációs adatbázisban tárolják az adatokat • Legalább két különböző nyelv (C# and SQL) • Különböző szintaxis • Különböző típusok • Különböző eszközök • Különböző paradigmák: objektum orientált vs. procedurális • Valamint meg kell tanulni az API-t ami összeköti az adatot a kóddal: ADO.NET • És a legnagyobb probléma: objektumok != relációs adatok
Ahogy EF előtt csináltuk - DataReader using (SQLConnection conn = new SQLConnection(“<conn string>”); { conn.Open(); SQLCommandcmd = conn.CreateCommand(); cmd.CommandText = “sp_StoredProc”; cmd.parameters.AddWithValue(“@City”, “Dallas”); using (SQLDataReaderrdr = cmd.ExecuteReader()) { while (rdr.read()) { string name = rdr.GetString(0); string city = rdr.GetString(1); } } } • Bármire képesek vagyunk, csak épp egyre több idő alatt és törékeny kódot létrehozva Hard kódolt sztringek! Nincs fordítási idejű ellenőrzés, sem Intellisense A paraméterek lazán kötve: A nevük, típusuk, darabszámuk nincs ellenőrizve futásig Az eredmények sem típusosak
Egy fokkal közelebb - DataSet dsNorthwinddsNorth = newdsNorthwind(); ProductsTableAdaptertaProducts = newProductsTableAdapter(); taProducts.Fill(dsNorth.Products); foreach (dsNorthwind.ProductsRow row in dsNorth.Products) { Response.Write(row.ProductName + " " + row.UnitPrice + "<br/>"); } • A háttérben még mindig SQL szkripteketírunk és az eredmények továbbra semazüzleti objektumainkba érkeznek
Agenda • Élet az EF előtt • Entity Framework bemutatása • Az Entity Data Model • Programozási koncepciók • További mappelési lehetőségek • Hogyan tovább
Mi az EntityFramework? • Az Entity Framework egy olyan adatelérési keretrendszer (angolul ORM (Object-Relational Mapper) API), amely segít áthidalni a különbségeket az alkalmazás adatstruktúrája és üzleti objektumai között. • Automatikusan létrehozza az adatokat reprezentáló entitásokat és a köztük lévő kapcsolatokat • Olyan flexibilis objektum modellt biztosít, amely lehetővé teszi az adatok objektumokhoz kötését többféle módon is • A LINQ kéréseket SQL lekérdezéssé transzformálja
Történelem, versenytársak • 1.0 2008 augusztusában, „votefor no confidence” • 4.0 2010 áprilisában • POCO, lazyloading, N-Tiersupport • továbbfejlesztett SQL, LINQ, designer, stb. • További ORM eszközök: • LINQ to SQL (VS2008) • Hibernate (Java) • NHibernate (.NET) • Enterprise Objects Framework (Mac OS) • És még sokan mások…
Mit csinál pontosan? • Az adatok konceptuális nézetén lehet végezni az adatok elérését, nem pedig magán az adatforráson • Automatikusan típusos entitás objektumok kerülnek létrehozásra, amelyek az adatok 1-1 összerendelése, de testre szabható • Automatikusan létrejönnek az objektumok között a kapcsolatok • Automatikusan lefordítja a LINQ lekérdezéseket SQL lekérdezésekké • Automatikusan példányosítja az entitás objektumokat az adatbázis lekérdezésekből • Automatikusan nyilván tartja a változásokat, intézi az adatbázis update/insert/delete-eket • Vizuális modellező eszközt biztosít Rob Vettor
<book> <title/> <author/> <year/> <price/> </book> Relational Objects XML LINQ oldalról nézve Query Operators C# 3.0 VB 9.0 LINQ Providers LINQ toObjects LINQ toDatasets LINQ toSQL LINQ toEntities LINQ toXML
ADO.NET oldalról nézve V3.0 Entity Framework LINQ to Entities, Entity SQL Programming Model ADO.NET Entity Provider (entity client) Conceptual Data Model Mapping Legacy ADO.NET 2.0 does not go away! ADO.NET Data Provider (SqlClient, OracleClient) Store Connection Reader Command Adapter Rob Vettor
Az EF architektúrája Object Services Entity Client EDM
Agenda • Élet az EF előtt • Entity Framework bemutatása • Az Entity Data Model • Programozási koncepciók • További mappelési lehetőségek • Hogyan tovább
Az Entity Data Model • Tábla megfeleltetése objektumnak • Constraintek(elsődleges kulcs, nullozhatóság stb.) • Öröklődések, sok-sok kapcsolatok kezelése { } CSDLKoncepcionális modell MSLMegfeleltetési leírás (map) SSDLAdatbázis fizikai modell Objektum Objektum Objektum Adatbázis
Ahogy tehát a mappelés működik • A teljes relációs adatbázist egy ObjectContext reprezentálja • Táblákból Entitás osztályok keletkeznek • Oszlopokból pedig mezők és tulajdonságok SQL C# kód Adatbázis ObjectContext [Database] Tábla Entitás osztály [Table] Oszlopok [Column] Mezők, tulajdonságok
Entity Data Model demó • EDM design módok • Databasefirst • ModelFirst (4.0 óta) • CodeFirst (4.1 óta) • Designer túra… • Új Entity Data Model létrehozása amapping wizardsegítségével • Entitások, skalár és navigációs tulajdonságok azEDM Designer-ben • Model Browser • Mapping Details • EDMX file • Generált entity class-ok Rob Vettor
Entity Data Model ismétlés Many-to-Many Navigationproperty-k reprezenálják.Elrejti az asszociációs entitást. Relationship Olyan objektum, amely az entitások közti asszociációt határozza meg Scalar Property Az entitás egy tulajdonsága Navigation Property Mutató a kapcsolódó entitás(ok)ra. Entity Az alap objektum
Agenda • Élet az EF előtt • Entity Framework bemutatása • Az Entity Data Model • Programozási koncepciók • További mappelési lehetőségek • Hogyan tovább
Az Object Context • Az EF tárolója • Belépési pont az entitásokhoz • Adatforrás kapcsolat menedzselője • Felelős az SQL generálásért • A példányosított entitások lokális cache-ekéntszolgál • Teljes változás követéstbiztosít • Konkurencia-éstranzakciómenedzsment • using (NorthwindEntitiesdb= new NorthwindEntities()) Object Context EntityDesigner Target Entity Factory DP az entitások pélányosítására
Konceptuális modell programozása EntityClient Object Services • Új SQL dialektus eSQL • BelülrőlADO.NET,connection-t és command-ot generál, datareader-t ad vissza • Highperformance – adatokat ad vissza, nem objektumokat • Megkérdőjelezhető felhasználás – talán ha csak adat kell, nem pedig entitás objektumok • Konceptuális model lekérdezése LINQsegítségével • Compile time típus ellenőrzés, debug támogatásés Intellisense • A lekérdezés eredmények erősen típusos entitás objektumokbapéldányosulnak • Erőforrás igényes: 1. Kifejezésfa elkészítése 2. Konvertálás SQL lekérdezéssé 3. Lekérdezés futtatása 4. Adatok fogadása 5. Adatok konvertálása objektumokká
Query (ExpressionPattern) szintaxis ismétlés from-mal kezdődik További from, join, let, where, vagyorderby fromidinsource { fromidinsource | joinidinsourceonexprequalsexpr [ intoid ] | letid = expr | wherecondition | orderbyordering, ordering, … } selectexpr | groupexprbykey [ intoidquery ] Végülselectgroup by Opcionálisaninto-val folytatható
Metódus szintaxis ismétlés var q =from m in list wherem.Title.StartsWith("S") select new { m.Title, m.Length }; QueryExpression Implicit típusú lokális változó Lambda kifejezések varq = list .Where( m => m.Length.StartsWith("S") ) .Select( m =>new{ m.Title, m.Length } ); Objektum inicializáló Bővítő metódusok Névtelen típus
LINQ-To-Entities demó • DEMÓ • Minden München-be szállított megrendelés lekérdezése • Eredmények renderelése DataGridView-ba • Generált SQL megtekintése SQL Profiler-el • “Query szintaxis” vs. “Method szintaxis”
Navigation Property-k • Order-ből:navigation property használata a kapcsolódóOrderDetailentitások eléréséhez: from o in Orderswhere 20 < o.OrderDetails.UnitPriceselect o; • OrderDetails-ből:navigation property használata a szülő Order entitás eléréséhez: from d in OrderDetailswhere d.Order.OrderID == 1select d; • DEMÓ Orders OrderID<pk> Order maps reference to collection of OrderDetailsobjects (EntitySet Type) OrderDetails OrderDetaillD<pk> OrderID <fk> OrderDetailsmaps reference to single Order object (EntityRef Type)
Lekérdezések vs. tárolt eljárások • EF támogatja mindkét megoldást • Paraméteres lekérdezések • EF automatikusan generálja • Az executionplan-ek ugyanúgy cache-elődnek és újrahasználhatóak • SQL-ben tábla szintű jogosultságot igényelnek • Tárolt eljárások • Security • Generált SQL kézben tartása teljesítmény • Viszont valós veszély, hogy az üzleti logika átkerül SQL oldalra…
LazyLoading (késleltetett betöltés) • A LINQ alapból a “deferred execution”-t használja • A legtöbbször a lekérdezés definiálásakor az nem fut le ténylegesen //define query var query = from c in ctx.Customerswhere c.Region == "OR"orderbyc.CompanyNameselect c; //execute query dgvQuery.DataSource = query; • A lekérdezés csak akkor kerül futtatásra, amikor az eredményre szükség van: • Kontrollhoz kötéskor • Foreach ciklusban az adatokon végigiteráláshoz • Kollekcióvá alakításkor, pl. ToList(), ToArray() • Egy objektum lekérdezésekor (aggregáláskor, vagy pl. First(), Last())
Objektum gráfok betöltése • Objektum gráf: egymáshoz kapcsolódó objektumok halmaza • Alapértelmezetten a gyerek objektumhalmazok egyesével töltődnek be(külön karika az adatbázis felé), amikor szükség van rájuk • AzInclude()metódus segítségévelelőre definiálhatjukazobjektum gráfot, így egyetlen lekérdezéssel töltődik be az egész a memóriába • DEMÓ • Objektum gráf betöltése (Order-hez: OrderDetail-ek és Customer) Customer Order Order Detail Product Category
Változás követés • Az ObjectContext automatikusan követi a változásokat az ObjectStateManagerobjektuma segítségével • Lekérdezéskor becache-eli az eredeti értékeket • Mentéskor (SaveChanges()) automatikusan létrehozza az update/insert/delete SQL parancsokat • Változás követés kikapcsolása (csak olvasás esetén): • context.Products.MergeOption= MergeOption.NoTracking;
Update / Insert / Delete • Update: entitás tulajdonságának változtatása • Insert: több lépéses folyamat • Új entitás objektum definiálása • Az entitás hozzáadása az ObjectContext-hez • SaveChanges() meghívása az adatbázisba mentéshez • Delete: • db.Products.DeleteObject(product); • db.SaveChanges(); • DEMÓ • Változtatás, mentés • ObjectStateManager megtekintése • A generált SQL parancsok
Agenda • Élet az EF előtt • Entity Framework bemutatása • Az Entity Data Model • Programozási koncepciók • További mappelési lehetőségek • Hogyan tovább
Objektumorientált sajátosságok leképezése ProductBase • Öröklődés példák • Table per Hierarchy • Egyetlen tábla • Table per Type • Öröklődésenként egy tábla • Splitting • Több tábla egy entitásba • Egy tábla több entitásba • Sok-sok kapcsolat • Két oszlopos kapcsolótábla • DEMÓ TestProduct Product DiscontinuedProduct * * Employee Territory
Table-Per-Hierarchy összerendelés • Entitások közti sima öröklődés - egy adatbázis tábla • Az összerendelés adiscriminator columnalapján történik valamilyen feltétel mentén • A származtatott típusok lekérdezhetőek wherefeltétel nélkül azOfType() metódussal: from c in db.Products.OfType<DiscontinuedProduct>() • Limitáció: nehéz a diszkriminátor oszlopot módosítani EF-el – adatbázis megoldás segít (trigger / sp) Base Type Discriminator Column Entities Database Table Product DiscontinuedFlag Product DiscontinuedProduct Derived Type
Table-Per-Type összerendelés • A modellben lényegében az asszociációt cseréljük öröklődésre • Kiküszöböli a navigációs tulajdonságok használatának szükségességét a bejárásra • A származtatott típusok szintén hozzáférhetőek az OfType() metódus használatával • Limitáció: gyermeket nem lehet törölni anélkül, hogy a szülőt is törölnénk
Feldarabolás (Splitting) EntitySplitting TableSplitting
Agenda • Élet az EF előtt • Entity Framework bemutatása • Az Entity Data Model • Programozási koncepciók • További mappelési lehetőségek • Hogyan tovább
További info • Bátyai Krisztián EF linkgyűjteménye: • http://goo.gl/Pk1MT • ZeeshanHirani: EF segédlet • http://goo.gl/VaIVJ • MS Data Development videók: • http://goo.gl/VeMwn
Kérdések Köszönöm a figyelmet!