Upload
bertille-marley
View
105
Download
0
Embed Size (px)
DESCRIPTION
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 - PowerPoint PPT Presentation
Citation preview
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
4
using (SQLConnection conn = new SQLConnection(“<conn string>”); {
conn.Open();SQLCommand cmd = conn.CreateCommand();cmd.CommandText = “sp_StoredProc”;cmd.parameters.AddWithValue(“@City”, “Dallas”);using (SQLDataReader rdr = 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ámuknincs ellenőrizve futásig
Az eredmények sem típusosak
Egy fokkal közelebb - DataSetdsNorthwind dsNorth = new dsNorthwind();
ProductsTableAdapter taProducts = new ProductsTableAdapter();
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 sem az ü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
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
Mi az Entity Framework?
Történelem, versenytársak
1.0 2008 augusztusában, „vote for no confidence”
4.0 2010 áprilisában POCO, lazy loading, N-Tier support továbbfejlesztett SQL, LINQ, designer, stb.
További ORM eszközök: LINQ to SQL (VS 2008) Hibernate (Java) NHibernate (.NET) Enterprise Objects Framework (Mac OS) És még sokan mások…
Mit csinál pontosan?
Rob Vettor
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
Objects
<book> <title/> <author/> <year/> <price/></book>
XML
LINQ Providers
C# 3.0 VB 9.0
Relational
LINQ toObjects
LINQ toSQL
LINQ toXML
LINQ toEntities
LINQ toDatasets
Query Operators
LINQ oldalról nézve
Rob Vettor11
Store
ADO.NET Data Provider(SqlClient, OracleClient)
Command
ConnectionReader
Adapter
V3.0
Conceptual Data Model
Legacy ADO.NET 2.0 does not go away!
ADO.NET Entity Provider (entity client)
LINQ to Entities, Entity SQL
Entity Framework
Programming Model
Mappin
g
ADO.NET oldalról nézve
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
Tábla megfeleltetése objektumnak Constraintek (elsődleges kulcs, nullozhatóság stb.) Öröklődések, sok-sok kapcsolatok kezelése
CSDLKoncepcionáli
s modell
{ }MSL
Megfeleltetési leírás (map)
SSDLAdatbázis
fizikai modell
ObjektumObjektum
Objektum
Az Entity Data Model
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
Tábla
Oszlopok
ObjectContext
Entitás osztályMezők,
tulajdonságok
[Database]
[Table]
[Column]
Entity Data Model demó
EDM design módok Database first Model First (4.0 óta) Code First (4.1 óta)
Designer túra… Új Entity Data Model létrehozása a mapping wizard
segítségével Entitások, skalár és navigációs tulajdonságok az EDM
Designer-ben Model Browser Mapping Details EDMX file Generált entity class-ok Rob Vettor
16
Entity Data Model ismétlés
RelationshipOlyan objektum, amely az entitások közti asszociációthatározza meg
Scalar PropertyAz entitás egy tulajdonsága
Navigation PropertyMutató a kapcsolódóentitás(ok)ra.
Many-to-ManyNavigation property-k reprezenálják. Elrejti az asszociációs entitást.
EntityAz 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 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ént szolgál Teljes változás követést biztosít Konkurencia- és tranzakció
menedzsment
Entity Designer
Object Context
Target Entity
using (NorthwindEntities db = new NorthwindEntities())
Factory DP az entitásokpélányosítására
Az Object Context
Konceptuális modell programozása
Entity Client Object Services
Új SQL dialektus eSQL Belülről ADO.NET, connection-t és command-ot
generál, data reader-t ad vissza
High performance – 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 LINQ segí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 objektumokba pé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 (Expression Pattern) szintaxis ismétlés
from id in source{ from id in source | join id in source on expr equals expr [ into id ] | let id = expr | where condition | orderby ordering, ordering, … } select expr | group expr by key[ into id query ]
from-mal kezdődik További from,
join, let, where, vagy orderby
Végül select group byOpcionálisan
into-val folytatható
A Query Expression Pattern
metódusai
Where
Select, SelectMany
OrderBy, OrderByDescending, ThenBy, ThenByDescending
GroupBy
Join, GroupJoin
Cast<T>
Metódus szintaxis ismétlés
var q = from m in list where m.Title.StartsWith( "S" ) select new { m.Title, m.Length };
var q = list.Where( m => m.Length.StartsWith( "S" ) ) .Select( m => new { m.Title, m.Length } );
Bővítő metódusok
Lambda kifejezések
Query Expression
Objektum inicializáló
Névtelen típus
Implicit típusú lokális változó
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”
Order-ből: navigation property használata a kapcsolódó OrderDetail entitá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Ó
OrdersOrderID <pk>
OrderDetailsOrderDetaillD<pk>OrderID <fk>
Order maps reference to collection of OrderDetails objects (EntitySet Type)
OrderDetails maps reference to single Order object (EntityRef Type)
Navigation Property-k
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 execution plan-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…
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 queryvar query = from c in ctx.Customerswhere c.Region == "OR"orderby c.CompanyNameselect c;// execute querydgvQuery.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())
Lazy Loading (késleltetett betöltés)
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
Az Include() metódus segítségével előre definiálhatjuk az objektum 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 ProductOrder CategoryOrder Detail
Változás követés
Az ObjectContext automatikusan követi a változásokat az ObjectStateManager objektuma 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
Ö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Ó
ProductBase
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 a discriminator column alapján történik
valamilyen feltétel mentén A származtatott típusok lekérdezhetőek where feltétel
nélkül az OfType() 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)
Product
DiscontinuedFlag
Database Table Entities
DiscriminatorColumn
DiscontinuedProduct
Product
Base Type
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
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
EF könyvek
Bátyai Krisztián EF linkgyűjteménye: http://goo.gl/Pk1MT
Zeeshan Hirani: EF segédlet http://goo.gl/VaIVJ
MS Data Development videók: http://goo.gl/VeMwn
További info