1 / 39

Entity Framework

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

Download Presentation

Entity Framework

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Entity Framework Török János Zsolt torokjzsolt@gmail.com

  2. 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

  3. 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

  4. 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

  5. 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

  6. 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

  7. 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

  8. 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…

  9. 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

  10. <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

  11. 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

  12. Az EF architektúrája Object Services Entity Client EDM

  13. 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

  14. 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

  15. 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

  16. 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

  17. 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

  18. 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

  19. 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

  20. 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á

  21. 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ó

  22. 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

  23. 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”

  24. Generált SQL példa

  25. 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)

  26. 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…

  27. 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())

  28. 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

  29. 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;

  30. 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

  31. 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

  32. 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

  33. 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

  34. 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

  35. Feldarabolás (Splitting) EntitySplitting TableSplitting

  36. 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

  37. EF könyvek

  38. 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

  39. Kérdések Köszönöm a figyelmet!

More Related