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!