Entity Framework
Download
Report
Transcript Entity Framework
ENTITY FRAMEWORK
Török János Zsolt
[email protected]
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>”);
{
Hard kódolt sztringek!
conn.Open();
Nincs fordítási idejű
SQLCommand cmd = conn.CreateCommand();
ellenőrzés, sem Intellisense
cmd.CommandText = “sp_StoredProc”;
cmd.parameters.AddWithValue(“@City”, “Dallas”);
using (SQLDataReader rdr = cmd.ExecuteReader())
A paraméterek lazán kötve:
{
A nevük, típusuk, darabszámuk
while (rdr.read())
nincs ellenőrizve futásig
{
string name = rdr.GetString(0);
Az eredmények sem
string city = rdr.GetString(1);
típusosak
}
}
}
Bármire képesek vagyunk, csak épp egyre több idő alatt
és törékeny kódot létrehozva
4
Egy fokkal közelebb - DataSet
dsNorthwind 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
Mi az Entity Framework?
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, „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?
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
LINQ oldalról nézve
Query Operators
C# 3.0
VB 9.0
LINQ Providers
LINQ to
Objects
LINQ to
Datasets
LINQ to
SQL
LINQ to
Entities
LINQ to
XML
<book>
<title/>
<author/>
<year/>
<price/>
</book>
Objects
Relational
XML
ADO.NET oldalról nézve
V3.0 Entity Framework
Programming
Model
Legacy ADO.NET 2.0 does not go away!
11
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
{
}
Objektum
Objektum
Objektum
Tábla
megfeleltetése objektumnak
Constraintek (elsődleges kulcs, nullozhatóság stb.)
Öröklődések, sok-sok kapcsolatok kezelése
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
C# kód
SQL
Adatbázis
[Database]
ObjectContext
[Table]
Entitás osztály
[Column]
Mezők,
tulajdonságok
Tábla
Oszlopok
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
16
Rob Vettor
Entity Data Model ismétlés
Relationship
Scalar
Olyan objektum,
amelyProperty
az Navigation Property
Az entitás egy Mutató
tulajdonsága
a kapcsolódó
entitások közti asszociációt
entitás(ok)ra.
határozza meg
Entity
Az alap objektum
Many-to-Many
Navigation property-k
reprezenálják. Elrejti az
asszociációs entitást.
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
using (NorthwindEntities db = new NorthwindEntities())
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
Object Context
Entity Designer
Target Entity
Factory DP az entitások
pélányosítására
Konceptuális modell programozása
Entity Client
Object Services
Konceptuális
Új SQL dialektus
lekérdezése
eSQL
model
LINQ segítségével
Belülről ADO.NET,
connection-tdebug
és command-ot
data
Compile
time típus ellenőrzés,
támogatásgenerál,
és Intellisense
reader-t ad vissza
A lekérdezés eredmények erősen típusos entitás objektumokba
High performance – adatokat ad vissza, nem objektumokat
példányosulnak
Megkérdőjelezhető
felhasználás – talán ha csak adat kell, nem
Erőforrás
igényes: 1. Kifejezésfa
elkészítése 2. Konvertálás SQL
pedig entitás objektumok
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-mal
kezdődik
További from, join, let,
where, vagy orderby
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 ]
Opcionálisan
into-val
folytatható
Végül select
group by
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 };
Implicit típusú
lokális változó
Query
Expression
Lambda
kifejezések
var q = list
.Where( m => m.Length.StartsWith( "S" ) )
.Select( m => new { m.Title, m.Length } );
Bővítő
metódusok
Névtelen
típus
Objektum
inicializáló
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”
Generált SQL példa
Navigation Property-k
Orders
OrderID <pk>
Order maps reference to collection of OrderDetails objects (EntitySet Type)
Order-ből: navigation property használata a
kapcsolódó OrderDetail entitások eléréséhez:
from o in Orders
where 20 < o.OrderDetails.UnitPrice
select o;
OrderDetails-ből: navigation property
használata a szülő Order entitás eléréséhez:
from d in OrderDetails
where d.Order.OrderID == 1
select d;
OrderDetails
OrderDetaillD<pk>
OrderID <fk>
OrderDetails maps reference to single Order object (EntityRef Type)
DEMÓ
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
SQL kézben tartása teljesítmény
Viszont valós veszély, hogy az üzleti logika átkerül SQL
oldalra…
Generált
Lazy Loading (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.Customers
where c.Region == "OR"
orderby c.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
Customer
Order
Order Detail
Product
Category
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)
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
Delete:
Ú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
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
Table per Type
Egyetlen tábla
Ö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Ó
* *
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)
Base Type
Database Table
Discriminator
Column
Entities
Product
Product
DiscontinuedFlag
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)
Entity Splitting
Table Splitting
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
További info
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
Kérdések
Köszönöm a figyelmet!