39
ENTITY FRAMEWORK Török János Zsolt [email protected]

Entity Framework

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

ENTITY FRAMEWORKTö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

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

EntityClient

Object Services

EDM

Az EF architektúrája

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”

Generált SQL példa

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

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

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

Köszönöm a figyelmet!

Kérdések

Kép beszúrásához kattintson az ikonra