You are on page 1of 85

CHNG 1: .NET FRAMEWORK 4.

5
1.1 Tng quan
1.1.1

Gii thiu

.NET Framework l mt cng ngh h tr vic xy dng v chy cc th h tip


theo ng dng v dch v web XML. .NET Framework c thit k hon thnh
cc mc tiu sau y:
Cung cp mi trng lp trnh hng i tng ph hp cho d m i
tng c lu tr v thc thi cc b, tuy vy c th phn phi qua internet
hoc thc thi t xa.
Cung cp mi trng thc thi sao cho gim thiu s chng trnh c trin
khai v xung t cc phin bn.
Cung cp mi trng thc thi m y mnh s an ton ca cc on m
thc thi, bao gm cc on m c to ra bi bn th ba v danh hoc bn
tin cy.
Cung cp mi trng thc thi m c th loi b c cc vn hiu sut
ca cch vit v mi trng thng dch.
Gip cho cc nh pht trin c kinh nghim nht qun trn nhiu loi ng
dng, chng hn nh cc ng dng trn nn tng Windows v cc ng dng
trn nn tng web.
Xy dng tt c cc giao tip da trn tiu chun cng nghip chc chn
rng m da trn .NET Framework c th tch hp vi bt k m no.
.NET Framework bao gm b thc thi ngn ng chung (Common Languge
Runtime - CLR) v lp th vin .NET Framework (FCL). CLR l nn tng ca .NET
Framework. Bn c th ngh runtime nh l tc nhn qun l m ti thi gian thc
hin, cung cp cc ng dng ct li nh qun l b nh, qun l lung v remoting,
xc nhn m ngun an ton v cc hnh thc khc ca vic chnh xc m ngun. Trong
thc t, khi nim v qun l m l nguyn tc c bn ca runtime. Trong lp trnh,
mc tiu runtime c xem nh qun l m (managed code), trong khi cc m khng
c thc thi bi runtime c xem nh m khng qun l. Th vin l mt b su
tp ton din, hng i tng m bn c th ti s dng pht trin cc ng dng
khc nhau, t cc ng dng dng lnh hoc giao din ha (GUI) n cc ng dng
1

da trn s sng to cung cp bi ASP.NET, chng hn nh biu mu web, hoc dch


v web XML.

Hnh 1.1 Kin trc .NET Framework


.NET Framework c lu tr bi cc thnh phn khng qun l, CLR c ti
n cc processes ca thnh phn ny v bt u thc thi managed code, do to ra
mi trng phn mm c th khai thc tnh nng qun l v khng qun l. .NET
Framework khng ch cung cp mt s host runtime, tuy nhin vn h tr s pht
trin cc host runtime t bn th ba.
V d nh cc host ASP.NET runtime m bo s n nh, mi trng my ch
cho cc m qun l. ASP.NET lm vic trc tip theo thi gian thc phc v cho
ng dng ASP.NET v dch v web XML.
Internet Explorer l v d v mt ng dng khng c qun l thi gian thc
(trong hnh thc m rng MIME). Bng cch s dng Internet Explorer lu tr
thi gian thc cho php bn nhng cc thnh phn c qun l hoc cc Windows
Form control trong vn bn HTML. Lu tr thi gian thc theo cch ny lm cho cc
m di ng c th qun l. Nhng vi nhng ci tin ng k ch cung cp cho qun l
m, chng hn nh thc thi bn tin cy v c lp tp tin lu tr.
Minh ha di y cho thy mi quan h gia CLR v th vin n ng dng
ca bn v h thng tng th. ng thi cho thy m qun l hot ng trong vng
kin trc ln hn:
2

Hnh 1.2 Mi quan h gia CLR v th vin n cc ng dng


1.1.2

Common Language Runtime

Common Language Runtime (gi tt l b thc thi - CLR) qun l b nh,


thc thi lung, thc thi m ngun, xc nhn m ngun an ton, bin dch v cc dch
v h thng khc. Cc tnh nng ny l yu t ni ti ca m qun l chy trn CLR.
Lin quan n vn bo mt, cc thnh phn qun l (managed components)
c cp mc tin tng, ty thuc vo cc yu t ngun gc (internet, mng doanh
nghip hay my tnh cc b). iu ny c ngha rng mt thnh phn qun l c th
hoc khng th thc hin hot ng truy cp tp tin, hot ng truy cp ng k hoc
chc nng nhy cm khc, ngay c khi n c dng trong ng dng hot ng tng
t.
Runtime thc thi on m truy cp an ton. V d ngi dng c th tin tng
rng mt tp tin thc thi c nhng vo mt trang web c th chy ng trn mn
hnh, hoc ht mt bi ht, nhng khng th truy cp d liu c nhn ca h, tp tin h
thng, hoc mng. Cc tnh nng bo mt ca runtime nh vy cho php chnh ng
cc phn mm internet trin khai em li cc tnh nng c bit phong ph.
3

Runtime cng thc thi m mnh m bng cch thc hin c s h tng cht ch
v xc nhn m ngun gi l common type system (CTS). CTS m bo rng tt c
cc m qun l t m t (self-describing). S khc nhau trnh bin dch Microsoft v
bn th ba to ra m qun l u ph hp ci CTS. iu ny c ngha rng m qun l
c th s dng cho cc loi qun l, trng hp khc nhau, trong khi thc thi nghim
tc yu t trung thc v an ton.
Ngoi ra, mi trng qun l ca runtime loi b nhiu vn phn mm ph
bin. V d, runtime t ng x l i tng giao din v qun l tham chiu n i
tng, gii phng chng khi khng c s dng li. Qun l b nh t ng x l 2
li ng dng ph bin, r r b nh v tham chiu b nh khng hp l.
Runtime cng tng tc nng sut pht trin. V d, lp trnh vin c th vit
chng trnh trong ngn ng pht trin m h chn, nhng c th tn dng thi
runtime, lp th vin, v thnh phn vit bng ngn ng khc ca nh pht trin khc.
Bt k nh cung cp trnh bin dch la chn mc tiu runtime u c th lm nh vy.
Mc tiu ca trnh bin dch ngn ng ca .NET Framework l lm cho cc tnh nng
sn c ca .NET Framework tn ti m c vit trong ngn ng, gip gim bt qu
trnh chuyn i cho cc ng dng hin c.
Trong khi runtime c thit k cho cc phn mm tng lai, n cng h tr cho
phn mm hin ti v qu kh. Kh nng tng thch gia m qun l v khng qun
l cho php nh pht trin tip tc s dng cc thnh phn COM v DLL cn thit.
Runtime c thit k nng cao hiu sut. Mc d CLR cung cp nhiu dch
v runtime tiu chun, managed code th khng bao gi thng dch. Mt tnh nng gi
l bin dch (JIT) cho php tt c cc m qun l chy bng ngn ng my m n thc
hin trn . Trong khi , qun l b nh loi b kh nng phn mnh b nh v tng
tc truy xut b nh cc b tng hiu sut.
Cui cng, runtime c th lu tr (hosted) bi hiu sut cao, pha my ch ng
dng, nh Microsoft SQL Server v Internet Information Services (IIS). C s h tng
ny cho php bn dng m qun l vit business logic ca bn, trong khi vn tri
nghim hiu sut vt tri ca ngnh cng nghip my ch doanh nghip h tr lu
tr thi gian thc.
4

1.1.3

.NET Framework Class Library

.NET Framework class library l mt b su tp cc loi c th s dng nhiu


ln c tch hp vo CLR. Class library hng i tng, cung cp cc loi m bn
s hu m qun l nhm khai thc chc nng. iu ny khng ch lm cho .NET
Framework d s dng, m cn gim thi gian hc tnh nng mi ca .NET
Framework. Ngoi ra, cc thnh phn ca bn th ba c th tch hp lin mch vi cc
class trong .NET Framework.
V d, b su tp cc Class .NET Framework thc thi mt giao din m bn c
th s dng pht trin b su tp class do bn s hu. B su tp class ca bn s
c pha trn hon ton vi cc class trong .NET Framework.
Bn mong ch lp th vin hng i tng, cc loi .NET Framework cho php
bn thc hin mt lot cc nhim v lp trnh ph bin, bao gm cc cng vic nh
qun l chui, thu thp d liu, kt ni c s d liu v truy cp tp tin. Ngoi cc tc
v chung, class library cn h tr cc trng hp pht trin t bit. V d bn c th
s dng .NET Framework pht trin cc loi ng dng v dch v sau y:
Console applications.
Windows GUI applications (Windows Forms).
Windows Presentation Foundation (WPF) applications.
ASP.NET applications.
Web services.
Windows services.
ng dng nh hng ng dng dng Windows Communication
Foundation (WCF).
ng dng cho php lm vic theo lung (workflow) dng Windows
Workflow Foundation (WF).

1.2 Lch s pht trin


1.2.1

.NET Framework 1.0

y l phin bn u tin ca .NET Framework , n c pht hnh vo nm


2002 cho cc h iu hnh Windows 98, NT 4.0, 2000 v XP. Vic h tr chnh thc
5

t Microsoft cho phin bn ny kt thc vo 10/2007, tuy nhin thi gian h tr m


rng c ko di n 14/7/2009.
1.2.2

.NET Framework 1.1

Phin bn nng cp u tin c pht hnh vo 4/2003. S h tr ca Microsoft


kt thc vo 14/10/2008 v h tr m rng n 8/10/2013.
Nhng thay i so vi phin bn 1.0:
Tch hp h tr mobile ASP.NET (trc y ch l phn m rng ty
chn)
Thay i v kin trc an ninh s dng sandbox khi thc thi ng
dng t internet.
Tch hp h tr ODBX v c s d liu Oracle.
.NET Compact Framework
H tr IPv6 (Internet Protocol version 6)
Vi thay i khc trong API.
1.2.3

.NET Framework 2.0

K t phin bn ny, .NET Framework h tr y nn tng 64-bit. Ngoi ra,


cng c mt s thay i trong API; h tr cc kiu generic; b sung s h tr cho
ASP.NET; .NET Microsoft Framework mt phin bn .NET Framework c quan h
vi Smart Personal Objects Technology.
1.2.4

.NET Framework 3.0

y khng phi l mt phin bn mi hon ton, thc t ch l bn nng cp ca


.NET 2.0. Phin bn 3.0 ny cn c tn gi khc l WinFX, n bao gm nhiu s thay
i nhm h tr vic pht trin v chuyn i (porting) cc ng dng trn Windows
Vista. Tuy nhin, khng c s xut hin ca .NET Compact Framework 3.0 trong ln
pht hnh ny.
Bn thnh phn chnh trong phin bn 3.0:
Windows Presentation Foundation (WPF tn m l Avalon): y l
mt cng ngh mi, v l mt n lc ca Microsoft nhm thay i
6

phng php hay cc tip cn vic lp trnh mt ng dng s dng giao


din ha trn Windows vi s h tr ca ngn ng XAML.
Windows Communication Foundation (WCF tn m l Indigo): Mt
nn tng mi cho php xy dng cc ng dng hng dch v (servideoriented).
Windows Workflow Foundation (WF): Mt kin trc h tr xy dng
cc ng dng workflow (lung cng vic) mt cch d dng hn. WF
cho php nh ngha, thc thi v qun l cc workflow t c cch nhn
theo hng k thut v hng thng mi.
Windows CardSpace (tn m l InfoCard): mt kin trc qun l nh
danh (identity management) cho cc ng dng c phn phi.
Ngoi ra Silverlight (hay WPF/E) mt phin bn nhnh .NET Framework h tr
cc ng dng trn nn web, c Microsoft to ra cnh tranh vi Flash.
C th minh ha .NET 3.0 bng mt cng thc n gin:
.NET 3.0 = .NET 2.0 + WPF + WCF + WF + WCS
1.2.5

.NET Framework 3.5

c pht hnh vo 11/2007, phin bn ny s dng CLR 2.0. y c th c


xem l tng ng vi phin bn .NET Framework 2.0 SP1 v .NET Framework 3.0
SP1 cng li. .NET Compact Framework 3.5 c ra i cng vi phin bn .NET
Framework ny.
Cc thay i t phin bn 3.0:
Cc tnh nng mi cho ngn ng C# 3.0 v VB.NET 9.0
H tr Expression Tr v Lamda
Cc phng thc m rng (Extension methods)
Cc kiu n danh (Anonymous types)
LINQ
Phn trang (paging) cho ADO.NET
API cho nhp xut mng khng ng b (asynchronous network I/O)
Peer Name Resolution Protocol resolver
7

Ci thin WCF v WF
Tch hp ASP.NET AJAX
Namespace mi System.CodeDom
Microsoft ADO.NET Entity Framework 1.0
Cng nh phin bn 3.0, c th mnh ha s thay i ca .NET 3.5 bng cng
thc:
.NET 3.5 = .NET 3.0 + LINQ + ASP.NET 3.5 + REST
1.2.6

.NET Framework 4.0

Phin bn beta u tin ca .NET 4 xut hin vo 5/2009 v phin bn RC


(Release Candidate) c ra mt vo 2/2010. Bn chnh thc ca .NET 4 c cng
b v pht hnh cng vi Visual Studio 2010 vo 12/4/2010.
Cc tnh nng mi c Microsoft b sung trong .NET 4:
Dynamic Language Runtime
Code Contracts
Managed Extensibility Framework
H tr cc tp tin nh x b nh (memory-mapped files)
M hnh lp trnh mi cho cc ng dng a lung (multithreaded) v
bt ng b (asynchronous)
Ci thin hiu nng, cc m hnh workflow.
1.2.7

.NET Framework 4.5

Nhng thng tin u tin ca .NET Framework 4.5 c Microsoft cng b vo


14/9/2011 ti BUILD Windows Conference, v n chnh thc c ra mt vo
15/8/2012.

1.3 .NET Framework 4.5


1.3.1

.NET cho Windows Store App

Windows Store apps c thit k c bit cho cc chun v tn dng sc mnh


ca h iu hnh Windows. Mt tp con ca .NET Framework sn c cho vic xy
dng cc Windows Store app bng cch s dng C# hoc Visual Basic. Cc tp con
8

ny gi l .NET cho cc Windows Store app v c tho lun trong phn tng quan
Windows Dev Center.
1.3.2

Portable Class Library

Project Portable Class Library trong Visual Studio 2012 (hoc cc phin bn sau
ny) cho php bn vit v xy dng managed assemblies lm vic a nn tng .NET
Framework. Dng mt project Portable Class Library, chn nn tng (nh Windows
Phone v .NET cho cc Windows Store app) hng n. Nhng types sn c v cc
member trong project ca bn th t ng gii hn thnh cc common type v member
trn cc nn tng. bit thm chi tit, xem Cross-Platform Development vi .NET
Framework.
1.3.3

Cc yu t mi v ci tin

Nhm .NET Framework bt u cung cp lin tc cc tnh nng vi NuGet.


Tnh nng released out of band (OOB) cho php m rng nn tng h tr v gii thiu
cc chc nng mi. bit thm thng tin, xem .NET Framework v Out-of-Band
Releases.
Tnh nng mi ca .NET Framework 4.5:
Gim kh nng khi ng li h thng khi pht hin v ng ng
dng .NET Framework 4 ang hot ng.
H tr cc mng c kch thc trn 2 gigabytes (GB) trn nn tng
64-bit. Tnh nng ny c th c kch hot trong tp tin cu hnh
ng dng.
Hiu sut tt hn thng qua cc background garbage collection cho
my ch. Khi bn s dng background garbage collection trong .NET
Framework 4.5, tnh nng ny c kch hot t ng.
Background just-in-time (JIT) compilation, l ty chn c sn trn b
x l a li ci thit hiu sut ng dng.
Gii hn kh nng di ca cng c Regular Expressions s cho
php x l cc biu thc chnh quy trc khi kt thc.
Kh nng nh dng cc culture mc nh cho mt min ng dng.
9

Console h tr m Unicode (UTF-16).


H tr phin bn ca cultural string ordering v comparison data.
Hiu sut tt hn khi ly ti nguyn.
Ci tin Zip file nn c kch thc nh hn.
C th ty chnh reflection context override reflection behavior
mc nh thng qua CustomReflectionContext class.
H tr phin bn 2008 Internationalized Domain Names in
Applications

(IDAN)

trong

lp

System.Globalization.IdnMapping dng trn Windows 8.


So snh chui delegate h iu hnh thc hin Unicode 6.0, khi
.NET Framework dng trn Windows 8. Khi chy trn cc nn tng
khc, .NET Framework so snh chui d liu ca ring n, cho php
thc thi Unicode 5.x.
Kh nng tnh ton mng bm cho chui trn mt application domain
c bn.
H tr cc loi tham chiu gia Type v TypeInfo classes.
Managed Extensibility Framework (MEF):
Managed Extensibility Framework (MEF) cung cp cc tnh nng mi:
H tr cc loi generic.
Convention-based programming model cho php bn to ra cc phn
trn qui c t tn ch khng phi l thuc tnh.
Multiple scopes.
Mt tp con MEF m bn c th s dng khi to cc Windows Store
app. Cc tp con ny c sn trong gi ti v t th vin NuGet.
ci t, m project ca bn trong Visual Studio 2012, chn Manage
NuGet Packages t Project menu, v search online cho gi
Microsoft.Composition.
Asynchronous File Operations:

10

Trong .NET Framework, tnh nng mi khng ng b c thm vo ngn ng


C# v Visual Basic. Thm vo tnh nng task-based model cho php tc v thc hin
cc hot ng khng ng b. s dng m hnh ny, dng cc phng thc khng
ng b trong I/O classe.
1.3.4

Tools

Resource File Generator (Resgen.exe) cho php bn to mt tp tin .resw dng


trong cc Windows Store app t mt file.resources nhng trong .NET Framework
assembly.
Managed Profile Guided Optimization (Mpgo.exe) cho php ci thin thi gian
khi ng ng dng, s dng b nh (kch thc tp lm vic) v thng lng bng
cch ti u native image assemblies. Cng c command-line to ra h s d liu cho
native image application assemblies.
1.3.5

Parallel Computing

.NET Framework cung cp mt s tnh nng mi v ci tin cho parallel


computing. Chng bao gm ci thin hiu sut, gia tng control, ci thin vic h tr
cho lp trnh khng ng b, mt th vin dataflow mi v ci tin cc h tr cho
parallel debugging v phn tch hiu nng.
1.3.6

Web

ASP.NET 4.5 thm vo m hnh binding cho Web Forms, h tr WebSocket, x


l khng ng b, ci tin hiu sut v mt s tnh nng khc.
1.3.7

Networking

.NET Framework 4.5 cung cp mt giao din lp trnh mi cho cc ng dng


HTTP.
H tr cng bao gm mt giao din lp trnh mi cho vic nhn v tng tc vi
kt ni WebSocket bng cch s dng HttpListener v cc lp lin quan.
Ngoi ra, .NET Framework 4.5 bao gm cc ci tin mng:
URI h tr tng thch RFC.
H tr phn tch Internationalized Domain Name (IDN).
11

H tr Email Address Internationalization (EAI).


H tr ci tin IPv6.
H tr Dual-mode socket.
1.3.8

Windows Presentation Foundation (WPF)

Trong .NET Framework 4.5, Windows Presentation Foundation (WPF) c mt s


thay i v ci tin:
Ribbon control mi, n cho php bn thc thi giao din ngi dng
ribbon bng cch lu tr Quick Access Toolbar, Application Menu,
v cc tab.
Interface INotifyDataErrorInfo mi, h tr xc nhn ng b v
khng ng b d liu.
Tnh nng mi cho VirtualizingPanel v Dispatcher classes.
Ci tin hiu nng khi hin th mt nhm d liu ln bng cch truy
cp b cc ch non-UI.
Data binding cho php cc thuc tnh tnh, rng buc d liu ty
chnh cc loi hin thc ha giao din IcustomTypeProvider, v ly
thng tin data binding t mt binding expression.
Ti nh v d liu nh values change (live shaping).
C kh nng kim tra trong khi data context cho mt item container
b mt k ni.
Kh nng thit lp lng thi gian tri qua gia lc thay i thuc
tnh v cp nht d liu ngun.
Ci tin h tr hin thc ha weak event patterns. Ngoi ra, s kin
c th by gi chp nhn phn m rng.
1.3.9

Windows Communication Foundation (WCF)

Trong .NET Framework 4.5, cc tnh nng sau c thm vo lm n n gin


vit v duy tr cc ng dng WCF:
n gin ha tp tin cu hnh c to ra.
H tr pht trin contract-first.
12

H tr cu hnh ASP.NET tng thch d dng hn.


Thay i trong chuyn i gi tr thuc tnh mc nh gim kh
nng bn phi t li chng.
Cp nht lp XmlDictionaryReaderQuotas bn gim kh nng cu
hnh dung lng cho th vin c XML.
Xc nhn file cu hnh WFC l mt phn ca qu trnh xy dng, v
th bn c th pht hin li trc khi chy ng dng.
H tr trc tuyn khng ng b.
HTTPS protocol mapping lm d dng hin th im cui qua
HTTPS vi Internet Information Services (IIS).
C kh nng to ra siu d liu trong ti liu WSDL duy nht bng
cch nh du? WSDL thnh dch v URL.
Websockets h tr giao tip hai chiu trn cng 80 v 443 vi hiu
nng tng t nh TCP transport.
H tr cu hnh dch v trong m.
Ch gii XML Editor.
ChannelFactory h tr b nh m.
Nn m nh phn.
H tr UDP transport cho php nh pht trin vit dch v tin nhn s
dng fire and forget. Mt khch hng gi tin nhn n mt dch v
v khng c phn hi t dch v.
H tr nhiu ch xc thc trn mt single WCF endpoint khi dng
HTTP transport v transport security.
H tr cc dch v WFC s dng internationalized domain names
(IDNs).
1.3.10

Windows Workflow Foundation (WF)

Cc tnh nng mi c thm vo WF trong .NET Framework 4.5:


State machine workflows, c gii thiu nh mt phn ca .NET
Framework 4.0.1 (.NET Framework 4 Platform Update 1). Bn cp nht
ny bao gm mt s lp v tnh nng mi cho php nh pht trin to ra
13

state machine workflows. Cc lp v tnh nng c cp nht cho .NET


Framework 4.5 bao gm:
Kh nng thit lp breakpoints trn state.
Kh nng sao chp v dn transitions trn workflow designer.
Thit k h tr vic chia s trigger transition creation.
Tnh nng cho php to state machine workflows, bao gm:
StateMachine, State, and Transition.
Tnh nng nng cao Workflow Designer:
Tng cng kh nng tm kim trong Visual Studio, bao gm
Quick Find v Find in Files.
Kh nng t ng to ra mt Sequence activity khi con activity
th hai c thm vo container activity, v bao gm activities
trong Sequence activity.
H tr panning, cho php cc phn c th nhn thy ca mt quy
trnh lm vic (workflow) c thay i m khng cn s dng
thanh cun (scroll bars).
Xem pht tho ti liu cc thnh phn ca cng vic trong ch
tree-style, v cho php bn xem mt phn trong xem pht tho ti
liu.
C kh nng ch thch vo activities.
C kh nng nh ngha v hy cc activity delegate bng cch s
dng workflow designer.
T ng kt ni v t ng chn activities v transitions trong
state machine v s workflow.
Lu tr thng tin trng thi xem cho workflow trong element n ca
file XML, v th bn d dng xc nh v tr v chnh sa thng tin trng
thi xem.
NoPersistScope container activity ngn activities con mnh m.
H tr C# expressions:
Projects workflow dng visual basic s dng visual basic
expressions v project workflow dng c# s dng C# expressions.
14

Project C# workflow c to ra trong Visual Studio 2012 v c


visual basic expressions tng thch vi project C# workflow
dng C# expressions.
Ci tin phin bn:
Lp WorkflowIdentity mi, cung cp mt nh x gia persisted
workflow instancev workflow nh ngha n.
Thc hin song song nhiu phin bn workflow trong cng mt
host, bao gm WorkflowServiceHost.
Trong Dynamic Update, c kh nng thay i nh ngha ca mt
persisted workflow instance.
Pht trin dch v Contract-first workflow, h tr cung cp t ng to
ra cc activities ph hp vi hp ng dch v c sn.

15

CHNG 2: ENTITY FRAMEWORK


5.0
2.1 Tng quan v Entity Framework
2.1.1

Gii thiu v Entity Framework

The Microsoft ADO.NET Entity Framework l mt b nh x i tng


quan h (Object/Relational Mapping ORM) m cho php ngi lp trnh lm vic
trn cc d liu quan h nh cc i tng c th, loi b s cn thit ca hu ht cc
m plumbing m ngi lp trnh phi vit. S dng Entity Framework, ngi lp trnh
truy vn bng LINQ, sau ly v thao tc vi d liu nh cc i tng c khai
bo lc bin dch chng trnh. Cc thnh phn ORM ca Entity Framework cung cp
cc dch v nh change tracking, identity resolution, lazy loading, and query
translation cc lp trnh vin tp trung vo vic pht trin ng dng kinh doanh
logic hn l nguyn tc truy cp d liu c bn.

Hnh 2.1 Tng quan v Entity Framework


2.1.2
-

Cc tnh nng vt tri ca Entity Framework

Lm vic c vi nhiu my ch c s d liu (bao gm Microsoft SQL


Server, Oracle v DB2).
16

Bao gm cng c nh x mnh m cho php c th x l trn s c s d


liu thc t v lm vic tt vi cc th tc lu tr.

Cung cp cc cng c Visual Studio tch hp trc quan to cc m hnh


thc th v t ng to m hnh t mt c s d liu c sn. Mt c s d
liu mi c th c trin khai t mt m hnh, m c th ton quyn hiu
chnh.

Cung cp Code First to ra m hnh thc th bng m. Code First c th


nh x mt c s d liu c sn hay to mt c s d liu t m hnh.

Tng thch tt vi cc m hnh lp trnh ng dng .NET bao gm:


ASP.NET,

Windows

Presentation

Foundation

(WPF),

Windows

Communication Foundation (WCF) v WCF Data Services (trc kia l


ADO.NET Data Services).
2.1.3

Li ch ca Entity Framework

Entity Framework c xy dng trn m hnh dch v ADO.NET, vi dch v


c sn c cp nht thm h tr cho cc tnh nng mi ca Entity Framework. Bi
v iu ny, cc ng dng hin ti c xy dng trn ADO.NET c th c chuyn
sang Entity Framework d dng vi mt m hnh lp trnh quen thuc vi cc lp trnh
vin ADO.NET.
S dng Entity Framework vit cc ng dng theo hng d liu c cc li
ch:
-

Gim thi gia pht trin; framework cung cp kh nng truy cp d liu li
ngi lp trnh c th tp trung vo ng dng logic.

Ngi lp trnh c th lm vic vi s h tr ca mt m hnh i tng hng


trung tm hn, bao gm cc loi k tha (inheritance), thnh vin phc hp
(complex members), v cc mi quan h. Trong .NET Framework 4, Entity
Framework cng h tr Persistence Ignorance thng qua cc thc th Plain
Old CLR Objects (POCO).

Cc ng dng c gii thot khi hard-code ph thuc vo cng c d liu c


th hay lc lu tr bng cch h tr mt m hnh nim c lp vi m
hnh lu tr/vt l.
17

S nh x gia m hnh i tng v lc lu tr c th c th thay i m


khng cn thay i code ng dng.

Ngn ng tch hp truy vn (LINQ to Entity) cung cp IntelliSense (nhc lnh)


v thi gian bin dch xc nhn c php vit cc truy vn vi mt m hnh
nim.
2.1.4

Cc thnh phn ca Entity Framework

Entity Framework s dng Entity Data Model (EDM) m t i tng ng


dng c th hoc m hnh nim m chng trnh pht trin. EDM xy dng trn m
hnh lin kt thc (Entity Relationship model) c bit n rng ri tng tru
tng trn lc c s d liu logic. EDM c pht trin vi mc liu c bn tr
thnh m hnh d liu chung cho b cng ngh pht trin v my ch ca Microsoft.
Do , EDM c to ra s dng vi Entity Framework cng c th c tha hng
vi WCF Data Services (formerly ADO.NET Data Services), Windows Azure Table
Storage, SharePoint 2010, SQL Server Reporting Services, and SQL Server
PowerPivot for Excel, v hn na trong tng lai.
Cc thnh phn ca Entity Framework trong EDM:
-

Entity Framework da trn cc tp tin XML thc hin cc cng vic ca


mnh. Nhng tp tin thc hin 3 nhim v: xc nh m hnh nim,
xc nh m hnh lu tr v to ra nh x (mapping) gia m hnh vi
c s d liu vt l.

Hnh 2.1.4.1 Entity Data Model EDM


18

2.1.4.1 Conceptual schema definition language (CSDL)


CSDL l mt ngn ng da trn XML m t cc thc th, cc mi quan h, v
cc hm to nn mt m hnh nim ca ng dng hng d liu (data-driven
application). M hnh nim ny c th c s dng bi Entity Framework hay
WCF Data Services. Cc siu d liu (metadata) c m t vi CSDL c s dng
bi Entity Framework nh x cc thc th v mi quan h xc nh trong m hnh
nim vi mt ngun d liu.
CSDL c lu tr trong tp tin c phn m rng l .csdl bn trong th mc
cha project.
<!-- CSDL content -->
<edmx:ConceptualModels>
<Schema xmlns="http://schemas.microsoft.com/ado/2009/11/edm"
xmlns:cg="http://schemas.microsoft.com/ado/2006/04/codegeneration"
xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSch
emaGenerator"
Namespace="Vidu" Alias="Self"
xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotatio
n"
annotation:UseStrongSpatialTypes="false">
<EntityContainer Name="ViduContainer"
annotation:LazyLoadingEnabled="true">
<EntitySet Name="DanhSachSinhVien"
EntityType="Vidu.SinhVien" />
<EntitySet Name="DanhSachLopHoc" EntityType="Vidu.LopHoc" />
<AssociationSet Name="SinhVienLopHoc"
Association="Vidu.SinhVienLopHoc">
<End Role="SinhVien" EntitySet="DanhSachSinhVien" />
<End Role="LopHoc" EntitySet="DanhSachLopHoc" />
</AssociationSet>
</EntityContainer>

19

<EntityType Name="SinhVien">
<Key>
<PropertyRef Name="MSSV" />
</Key>
<Property Type="Int32" Name="MSSV" Nullable="false"
annotation:StoreGeneratedPattern="Identity" />
<Property Type="String" Name="HoTen" Nullable="false" />
<NavigationProperty Name="LopHoc"
Relationship="Vidu.SinhVienLopHoc"
FromRole="SinhVien" ToRole="LopHoc" />
</EntityType>
<EntityType Name="LopHoc">
<Key>
<PropertyRef Name="MaLop" />
</Key>
<Property Type="Int32" Name="MaLop" Nullable="false"
annotation:StoreGeneratedPattern="Identity" />
<Property Type="String" Name="TenLop" Nullable="false" />
<NavigationProperty Name="SinhVien"
Relationship="Vidu.SinhVienLopHoc"
FromRole="LopHoc" ToRole="SinhVien" />
</EntityType>
<Association Name="SinhVienLopHoc">
<End Type="Vidu.SinhVien" Role="SinhVien" Multiplicity="*" />
<End Type="Vidu.LopHoc" Role="LopHoc" Multiplicity="*" />
</Association>
</Schema>
</edmx:ConceptualModels>

20

2.1.4.2 Store schema definition language (SSDL)


SSDL l mt ngn ng da trn XML m t cc m hnh lu tr ca mt ng
dng Entity Framework.
SSDL c lu tr trong tp tin c phn m rng l .ssdl bn trong th mc
cha project.
<!-- SSDL content -->
<edmx:StorageModels>
<Schema Namespace="Vidu.Store" Alias="Self"
Provider="System.Data.SqlClient" ProviderManifestToken="2008"
xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchema
Generator" xmlns="http://schemas.microsoft.com/ado/2009/11/edm/ssdl">
<EntityContainer Name="ViduStoreContainer">
<EntitySet Name="DanhSachSinhVien"
EntityType="Vidu.Store.DanhSachSinhVien"
store:Type="Tables" Schema="dbo" />
<EntitySet Name="DanhSachLopHoc" EntityType="Vidu.Store.DanhSachLopHoc"
store:Type="Tables" Schema="dbo" />
<EntitySet Name="SinhVienLopHoc" EntityType="Vidu.Store.SinhVienLopHoc"
store:Type="Tables" Schema="dbo" />
<AssociationSet Name="FK_SinhVienLopHoc_SinhVien"
Association="Vidu.Store.FK_SinhVienLopHoc_SinhVien">
<End Role="SinhVien" EntitySet="DanhSachSinhVien" />
<End Role="SinhVienLopHoc" EntitySet="SinhVienLopHoc" />
</AssociationSet>
<AssociationSet Name="FK_SinhVienLopHoc_LopHoc"
Association="Vidu.Store.FK_SinhVienLopHoc_LopHoc">
<End Role="LopHoc" EntitySet="DanhSachLopHoc" />
<End Role="SinhVienLopHoc" EntitySet="SinhVienLopHoc" />
</AssociationSet>
</EntityContainer>

21

<EntityType Name="DanhSachSinhVien">
<Key>
<PropertyRef Name="MSSV" />
</Key>
<Property Name="MSSV" Type="int"
StoreGeneratedPattern="Identity" Nullable="false" />
<Property Name="HoTen" Type="nvarchar(max)" Nullable="false" />
</EntityType>
<EntityType Name="DanhSachLopHoc">
<Key>
<PropertyRef Name="MaLop" />
</Key>
<Property Name="MaLop" Type="int"
StoreGeneratedPattern="Identity" Nullable="false" />
<Property Name="TenLop" Type="nvarchar(max)" Nullable="false" />
</EntityType>
<EntityType Name="SinhVienLopHoc">
<Key>
<PropertyRef Name="SinhVien_MSSV" />
<PropertyRef Name="LopHoc_MaLop" />
</Key>
<Property Name="SinhVien_MSSV" Type="int" Nullable="false" />
<Property Name="LopHoc_MaLop" Type="int" Nullable="false" />
</EntityType>
<Association Name="FK_SinhVienLopHoc_SinhVien">
<End Role="SinhVien"
Type="Vidu.Store.DanhSachSinhVien" Multiplicity="1" />
<End Role="SinhVienLopHoc"
Type="Vidu.Store.SinhVienLopHoc" Multiplicity="*" />
<ReferentialConstraint>

22

<Principal Role="SinhVien">
<PropertyRef Name="MSSV" />
</Principal>
<Dependent Role="SinhVienLopHoc">
<PropertyRef Name="SinhVien_MSSV" />
</Dependent>
</ReferentialConstraint>
</Association>
<Association Name="FK_SinhVienLopHoc_LopHoc">
<End Role="SinhVienLopHoc"
Type="Vidu.Store.SinhVienLopHoc" Multiplicity="*" />
<End Role="LopHoc" Type="Vidu.Store.DanhSachLopHoc" Multiplicity="1" />
<ReferentialConstraint>
<Principal Role="LopHoc">
<PropertyRef Name="MaLop" />
</Principal>
<Dependent Role="SinhVienLopHoc">
<PropertyRef Name="LopHoc_MaLop" />
</Dependent>
</ReferentialConstraint>
</Association>
</Schema></edmx:StorageModels>

2.1.4.3 Mapping specification language (MSL)


MSL l mt ngn ng da trn XML m t cc nh x gia m hnh nim v
m hnh lu tr ca mt ng dng Entity Framework
MSL c lu tr trong tp tin c phn m rng l .msl bn trong th mc cha
project.
<!-- C-S mapping content -->
<edmx:Mappings>
<Mapping Space="C-S"

23

xmlns="http://schemas.microsoft.com/ado/2009/11/mapping/cs">
<EntityContainerMapping StorageEntityContainer="ViduStoreContainer"
CdmEntityContainer="ViduContainer">
<EntitySetMapping Name="DanhSachSinhVien">
<EntityTypeMapping TypeName="IsTypeOf(Vidu.SinhVien)">
<MappingFragment StoreEntitySet="DanhSachSinhVien">
<ScalarProperty Name="MSSV" ColumnName="MSSV" />
<ScalarProperty Name="HoTen" ColumnName="HoTen" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
<EntitySetMapping Name="DanhSachLopHoc">
<EntityTypeMapping TypeName="IsTypeOf(Vidu.LopHoc)">
<MappingFragment StoreEntitySet="DanhSachLopHoc">
<ScalarProperty Name="MaLop" ColumnName="MaLop" />
<ScalarProperty Name="TenLop" ColumnName="TenLop" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
<AssociationSetMapping Name="SinhVienLopHoc"
TypeName="Vidu.SinhVienLopHoc" StoreEntitySet="SinhVienLopHoc">
<EndProperty Name="SinhVien">
<ScalarProperty Name="MSSV" ColumnName="SinhVien_MSSV" />
</EndProperty>
<EndProperty Name="LopHoc">
<ScalarProperty Name="MaLop" ColumnName="LopHoc_MaLop" />
</EndProperty>
</AssociationSetMapping>
</EntityContainerMapping>
</Mapping></edmx:Mappings>

24

2.1.5

Kin trc x l d liu ca Entity Framework

EDM (Entity Data Model): EDM bao gm ba phn chnh: m hnh nim
(Concept model), nh x (Mapping) v m hnh lu tr (Storage model).
o Concept model: m hnh nim l cc lp m hnh v cc mi quan h ca
n. iu ny s c c lp vi thit k bng c s d liu ca bn.
o Storage model: m hnh lu tr l m hnh thit k c s d liu bao gm
bng, view, th tc lu tr v cc mi quan h v cc kha ca n.
o Mapping: bn nh x bao gm thng tin v s nh x t m hnh nim
thnh m hnh lu tr.

Hnh 2.2 Kin trc Entity Framework


-

LINQ to Entities: LINQ to Entities l ngn ng truy vn c s dng vit cc


truy vn i vi cc m hnh i tng. N tr v thc th c xc nh trong m
hnh nim.
25

Entity SQL: Entity SQL li l mt ngn ng truy vn ging nh LINQ to Entities.


Tuy nhin n kh khn hn mt cht sao vi L2E v cng pht trin cn phi tm
hiu n mt cch ring bit.

Object Service: l mt entry point x l d liu t c s d liu v tr li d liu.


Object Service chu trch nhim c th ha qu trnh chuyn i d liu t tng
Entity client data provide tr v thnh cu trc i tng thc th.

Entity Client Data Provider: trch nhim chnh ca layer ny l chuyn i cc


cu truy vn L2E v Entity Framework thnh truy vn SQL c hiu bi c s
d liu bn di. N giao tip vi ADO.Net data provider gi hoc nhn d
liu. EntityClient s dng Entity SQL truy vn.

ADO.Net Data Provider: l layer giao tip vi c s d liu theo tiu chun
ADO.Net.

EntityDataReader l lp bn trong EntityClient, c s dng c kt qu


truy vn.

DBDataReader c kt qu tr v t c s d liu.

Cc lnh truy vn t layer trn s c chuyn thnh cu trc lnh dng cy


(Command Tree) v chuyn xung cc layer di.
2.1.6

Cc phin bn ca Entity Framework

Hai phin bn u tin ca Entity Framework (EF 3.5 v EF 4.0) c km


theo vi .NET Framework. V c s version trng vi s version ca nn tng m n
c bao gm. Sau EF bt u chuyn thnh c lp v thng qua cc tiu chun
ca http://semver.org v semantic versioning.
Cc phin bn ca Entity Framework:
-

Entity Framwork 3.5: phin bn u tin ca Entity Framework c bao gm


trong NET 3.5 SP1 v Visual Studio 2008 SP1. Phin bn ny hi tr O/RM c bn
lm vic vi lung d liu Database First.

Entity Framework 4.0: Phin bn ny c a vo .NET Framework 4.0 v


Visual Studio 2010. Cc tnh nng mi trong phin bn ny bao gm h tr POCO,
26

lazy loading, ci thin kh nng kim tra, th h m ty bin v tin trnh Model
First.
-

Entity Framework 4.1: l phin bn u tin pht hnh NuGet. Phin bn ny bao
gm DbContext API v Code First c n gin ha.

Entity Framework 4.1.1: ngoi cc bn v li, phin bn ny gii thiu mt s


thnh phn lm n d dng hn cho cng c lc thit k lm vic vi m
hnh Code First.

Entity Framework 4.2: phin bn sa li cho EF 4.1.1.

Entity Framework 4.3: phin bn bao gm tnh nng mi Code First Migrations
(l qu trnh lm cho cc ng dng hin c c th chy trn cc my khc nhau hay
cc h iu hnh khc nhau) cho php mt c s d liu c to ra bi Code First
c thay i dn khi m hnh Code First ca bn pht trin.

Entity Framework 4.3.1: Bn v li bao gm mt s sa li ca phin bn EF 4.3


v h tr LocalBb tt hn cho ngi s dng EF 4.3 trn Visual Studio 2012.

Entity Framework 5.0:


Phin bn ny c th c s dng trong Visual Studio 2010 v Visual
Studio 2012 vit cc ng dng .NET 4.0 v .NET 4.5. Vi .NET 4.5,
phin bn ny gii thiu mt s tnh nng mi bao gm h tr enum
support, table-valued functions, spatial data types and various performance
improvements.
Nu bn to ra mt m hnh mi bng cch s dng Entity Framework bng
Visual Studio 2012, cc gi NuGet EF 5 s c ci t cho project ca bn
v m c to ra s c s dng EF5. Cc d n ASP.NET mi to trn
Visual Studio 2012 (bao gm c d n MVC) cng c cc gi NuGet EF5
ci theo mc nh.
Entity Framework Designer trong Visual Studio 2012 cng gii thiu h tr
multiple-diagrams cho mi m hnh, t mu cc hnh dng trn b mt thit
k v batch import cc th tc lu tr.
27

Entity Framework 6 (cha cng b chnh thc)

2.2 Gii thiu v Entity Framework 5.0


2.2.1

Gii thiu

Entity Framework 5.0 l mt sn phm pht hnh quan trng ca Microsoft. N


c th c s dng trong Visual Studio 2010 v Visual Studio 2012 vit cc ng
dng trn .NET 4.0 v .NET 4.5.
2.2.2

Cc tnh nng mi

Entity Framework 5.0 bao gm mt s tnh nng mi v sa li cho EF4.3. Hu


ht cc tnh nng mi ch c sn trong cc ng dng .NET 4.5.
Cc tnh nng mi ca EF 5.0:
-

H tr Enum cho php bn c cc thuc tnh enum trong lp thc th ca bn.

Cc loi d liu khng gian c th c tip xc trong m hnh ca bn bng


cch s dng DbGeography v cc DbGeometry.

Hiu

sut

truy

vn

ci

tin

http://blogs.msdn.com/b/adonet/archive/2012/02/14/sneak-preview-entityframework-5-0-performance-improvements.aspx
-

Code-First s pht hin nu bn c sn LocalDb hoc SQL Express to c


s d liu mi. Visual Studio 2012 bao gm LocalDb, trong khi Visual Studio
2010 bao gm SQL Express.

Code-First s thm bng vo c s d liu hin ti nu c s d liu ch


khng cha bt k cc bng no t m hnh.

Cc tnh nng mi ca EF Designer trong Visual Studio 2012:


Default DbContext code generation template: EF Designer s to ra
mt DbContext v cc lp POCO theo mc nh trong Visual Studio
2012.
Multiple-diagrams cho mi m hnh cho php bn chia nh m hnh
ca bn thnh nhiu m hnh nh khi m hnh ca bn qu ln. iu
ny gip bn d dng quan st cc m hnh hn.
28

Apply color cho cc thc th trong EF designer.


Table-Valued functions trong c s d liu c sn c th thm vo m
hnh ca bn. V vy, c th s dng LINQ truy vn trn kt qu.
Batch import of stored procedures cho php nhiu th tc lu tr
c thm vo m hnh trong qu trnh to m hnh.
2.2.3

Ci t Entity Framework 5.0

2.2.3.1 S dng dng lnh Package Manager Console


Visual Studio ca bn c ci t NuGet Package Manager (ti t
http://www.nuget.org ). Trong Visual Studio 2012, NuGet Package Manager c ci
t sn.
M giao din Package Manager Console v g lnh: Install-Package
EntityFramework version 5.0.
Entity Framework 5.0 s c ti v v t ng ci t trn project ca bn.
kim tra, ta vo th mc References ca Project

2.2.3.2 S dng giao din ha Manage NuGet Package


Nhp tri vo project ca bn chn Properties thit lp nn .NET Framework
cho project ca bn:

29

Ci t Entity Framework 5.0 bng cc nhp phi chut vo project mun ci t


v chn Manage NuGet Package.
Chn Online v tm kim vi t kha Entity Framework. Nhn Install ci t:

30

2.3 Cc hng tip cn Entity Framework


2.3.1

The Model first Workfl

2.3.1.1 nh ngha
-

Hng tip cn ny c b sung t phin bn EF 4 trong Visual 2010.

Bn c th to mt data model rng bng cng c Entity Data Model Designer,


khi object layer cng t ng c sinh ra. Sau khi hon thnh vic thit k,
bn c th s dng chc nng Generate Database from Model to ra cc m
DDL (data definition language) da trn m SSDL (Store Schema Definition
Language). Cc m DDL ny s c thc thi v lu thnh tp tin .sql.
2.3.1.2 S dng Model first

Gi s to mt Project c tn l ModelFirst to ra m hnh c s d liu l


QuanLyHocVien. Qu trnh thc bin c din t qua cc bc sau:
B1.

To Project ModelFirst

B2.

Nhn chut phi vo ModelFirst chn Add | New Item.

B3.

Chn ADO.NET Entity Data Model v t tn cho m hnh mun to

ra trong trng Name:

B4.

Click Add. Data Model Wizard c khi ng:

31

B5. Chn Empty Model v chn Finish. Vng thit k Entity Data Model
Designer hin ra

32

B6.

S dng ToolBox thit k m hnh c s d liu bng cc ko th cc

i tng Entity trn ToolBox vo vng thit k hay nhp phi vo vng
thit k chn Add New | Entity to ra cc i tng cn thit

t tn tp hp cc thc th, ta nh tn vo trng Entity Set. Thit lp


kha chnh ti phn Key Properrty.
B7.

Thm thuc tnh cho cc thc th, ta nhp phi chut vo thc th chn

Add New v chn cc loi thuc tnh mun thm. chnh sa cc thuc tnh
ta nhp chn vo thuc tnh chn Properties. Ca s Properties hin ra v
cha cc thng tin v thuc tnh ca thc th nh tn, kiu d liu ca thuc
tnh,.ta s thay i cc thng tin

33

B8.

to mi quan h gia hai thc th, ta nhp chut phi vo thc th v

chn Add New | Association. Hp thoi Add Association hin ra:

34

B9.

Thit lp cc loi lin kt cho cc thc th. N s t sinh ra cc kt ni

35

B10.

To c s d liu t m hnh va thit k. Chn cc thc th mun nh

x trong vng thit k. Nhp phi chut v chn Generate Database from
Model
B11. Ca s Generate Database Wizard xut hin:

B12. Chn New Connection, hp thoi Choose Data Source hin ra

B13. Chn Microsoft SQL Server v click OK, hp thoi Connection


Properties hin ra:

36

B14. Chn tn server bn mun s dng trong Server name


B15. nh tn c s d liu trong Select or enter a database name
B16. Click OK. Bn s thy mt hp thoi ni vi bn l c s d liu ca
bn cha tn ti. Visual Studio yu cu s cp quyn to c s d liu
cho bn
B17. Click Yes. Visual Studio to cho bn mt c s d liu mi. l mt
c s d liu trng n khng cha bt k mt bng, views, index, hay bt

37

c mt quan h no i vi 1 c s d liu. Bn s tr v vi hp thoi


Generate Database Wizard
B18. Click Next. Generate Database Wizard to ra lnh ngn ng nh
ngha d liu (Data Definition Language - DDL) to mi th trong m
hnh bn thit k. Bn c th thy c cc cu lnh SQL dng lm cho
m hnh ca bn thnh c s d liu tht v cc bng lin kt

B19. Click

Finish.

Bn

thy

cc

cu

lnh

trong

QuanLyHocVien.EDMX.sql. Nhng n cha c thc thi. Tt c nhng


g Generate Database Wizard lm l to ra lnh yu cu to m hnh c s
d liu chc nng ca bn.
38

B20. Chn SQL | Transact-SQL Editor | Execute. Bn s thy mt hp


thoi kt ni m bn c th nhp cc thng tin cn thit kt ni vi SQL
Server m bn chn.
B21. Nhp bt k thng tin cn thit v nhn Connect. Visual Studio kt ni
ti h qun tr c s d liu v thc thi lnh SQL m n to ra. Lc ny, c
s d liu ca bn tht s c s dng

Lm vic vi cc i tng Entity va to:


To mt container lu tr cc thng tin v c s d liu:
QuanLyHocVienModelContainer db = new QuanLyHocVienModelContainer();

Thm bn ghi vo c s d liu:


HocVien h = new HocVien();
h.HocVienId = 51;
h.HoTen = "Tran Chi Tam";
h.GioiTinh = false;
h.NgaySinh = DateTime.Parse("07/04/1992");
h.DiaChi.SoNha = "20";
h.DiaChi.ThanhPho = "Ca Mau";
LopHoc l = new LopHoc();
l.LopHocId = 02;
l.MonHoc = "He dieu hanh";
l.GioHoc = "7";

39

Lu bn ghi vo c s d liu:
db.HocVien.Add(h);
db.LopHoc.Add(l);
db.SaveChanges();

2.3.2 The database first workflow


2.3.1

nh ngha

y l cch cn c h tr t phin bn EF u tin trong Visual Studio 2008.

c s dng ng dng c sn c s d liu.

EF s t ng to ra m hnh d liu v cc lp i tng t database c sn thng


qua cng c Entity Data Model Wizard. C th thay i data model v cp nht
li vo database.

y l cch tip cn ph bin v thc hin n gin, nhanh chng nhng i hi


cn c c s d liu trc.
2.3.2

S dng Database frist

Gi s to mt Project c tn l DatabaseFirst kt ni ti mt c s d liu


QuanLyHocVien m ta to t project ModelFirst. Qu trnh thc bin c
din t qua cc bc sau:
B1.

To project v t tn project l DatabaseFirst

B2.

Nhp phi vo DatabaseFirst trong ca s Solution Explorer v chn

Add | New Item


B3.

Chn ADO.NET Entity Data Model


40

B4.

Nhp QuanLyHocVienModel.EDMX vo trng Name v chn Add.

Visual Studio s khi to cng c Entity Data Model Wizard

41

B5.

Chn mc Generate From Database v chn Next. Chn c s d liu

mun kt ni

B6.

Chn Next. Chn cc thnh phn ca c s d liu mun s dng trong

ng dng:

42

Drill down vo i tng Tables bng cc click vo cc mi tn cnh

B7.

mi mc hin ra cc bng c trong c s d liu v ly ra nhng bng cn


dng.
B8.

Chn Finish. Sau , ta s thy m hnh c to ra t c s d liu.

B9.

Chn Buid | Solution lu li nhng thay i bn to ra v sau

bin dch ng dng.


-

Lm vic vi cc i tng Entity va to:


To i tng cha tp hp cc i tng Entity c nh ngha trong m
hnh c s d liu:
QuanLyHocVienEntities db = new QuanLyHocVienEntities();

To cc i tng mi:
43

HocVien h = new HocVien();


h.HocVienId = 51;
h.HoTen = "Luong Thi Nhu Quynh";
h.GioiTinh = false;
h.NgaySinh = DateTime.Parse("15/08/1992");
h.DiaChi_SoNha = "22A/1";
h.DiaChi_ThanhPho = "Bien Hoa";

LopHoc l = new LopHoc();


l.LopHocId = 01;
l.MonHoc = "Lap trinh";
l.GioHoc = "7";

Thm bn ghi v lu li:


db.HocVien.Add(h);
db.LopHoc.Add(l);
db.SaveChanges();

2.3.3 The Code first workflow


2.3.3.1

nh ngha

Hng tip cn code first c gii thiu t phin bn EF 4.1.

Trong hng tip cn ny, ta hon ton lm vic vi code. Lp trnh vin s vit
cc ra cc lp m t cc i tng thc th tng ng vi cc bng trong c s
d liu. EF s t ng to ra c s d liu theo nhng g cc lp nh ngha.

h tr c vic kim tra tnh hp l ca d liu trong cc lp t nh ngha,


.NET Framework cung cp cc DataAnnotation v Fluent API.

44

2.3.3.2
-

S dng code first

Gi s ta to mt ng dng c tn CodeFirst v cha c sn c s d liu. to


c s d liu t code ta thc hin cc cng vic sau:

To project mi
B1.

To project mi

B2.

t tn cho project

B3.

t tn Solution l CodeFirstEx

nh ngha cc lp khi to
B1.

Nhp chut phi vo mc CodeFirstEx trong Solution Explorer chn


Add | New Project

B2.

Chn Class Library

B3.

Nhp tn ca class (ClassCodeFirst) v chn OK. Visual Studio to


mt lp th vin mi cho bn

B4.

Xa m lp Class1 c

B5.

nh ngha cho cc lp biu din cho cc thc th trong c s d liu


trong class1.cs:

// nh ngha hc vin
public class HocVien
{
public int HocVienId { get; set; }
public string HoTen { get; set; }
public bool GioiTinh { get; set; }
public DateTime NgaySinh { get; set; }
public DiaChi DiaChi { get; set; }

public virtual ICollection<LopHoc> LopHocs { get; set; }


}
// Thuc tnh phc hp
public class DiaChi
{
public string SoNha { get; set; }

45

public string ThanhPho { get; set; }


}
// nh ngha lp hc
public class LopHoc
{
public int LopHocId { get; set; }
public string Mon { get; set; }
public string GioHoc { get; set; }

public virtual ICollection<HocVien> HocViens { get; set; }


}

nh ngha lin kt gia hai thc th bn to mt ng ICollection l mt i


tng o cha cc thc th lin kt. i tng o ny khng phi cha d liu copy
ca cc thc th lin kt vi n m ch to ra ng link ti cc thc th .
Thm h tr Entity Framework 5.0 cho lp th vin. Sau thm cu lnh using
vo u class1.cs
using System.Data.Entity;

To code first context


Thm h tr Entity Framework CodeFirstClasses t ng cung cp tham
chiu n cc lp bn cn. Trong trng hp ny, bn cn truy cp vo
System.Data.Entity, nhng h tr ny c thm vo mt cch t ng cho bn
(m th mc References kim tra). Tuy nhin, Visual Studio khng hiu cch bn
to ra database context nh th no. Do ta phi nh ngha 1 context cho CSDL.
Thm vo class1.cs cc on Code sau:
public class QuanLyHocVienDBContext:DbContext
{
public QuanLyHocVienDBContext():base("QuanLyHocVien2")
{
}
public DbSet<HocVien> HocViens { get; set; }
public DbSet<LopHoc> LopHocs { get; set; }

46

on m trn s to ra hai kt ni n c s d liu. Th nht l to ra mt


bng c tn l HocViens lu tr cc bn ghi v hc vin v th hai l to ra bng
LopHocs cha cc bn ghi v lp hc.
Lp

QuanLyHocVienContext

tha

lp

DbContext

trong

System.Data.Entity. DbContext to ra s kt ni n c s d liu thc hin cc


nhim v CRUD (Creat, Read, Update, Delete). Tt c nhng thay i s c thu
thp v phn nhm trong ni dung v sau lu vo c s d liu nh mt hot ng
hng lot (trong cc v d trn ta thc hin thao tc trn d liu nhng n vn cha
c lu li vo c s d liu, ch khi gi n phng thc SaveChanges() th cc
thay i mi c lu). Trong phng thc base() bn t tn ( v d ny l
QuanLyHocVien2) cho c s d liu mnh mun to ra. Nu bn trng th tn c s
d liu s l <Tn namespace>.<Tn lp context> (trong v d ny l
CodeFirstClass.QuanLyHocVienDBContext).
DbSet<>: i din cho tp hp cc thc th. Ta c th hiu n tng ng vi
1 bng trong c s d liu quan h.
To v thm bn ghi vo c s d liu
B1. Thm h tr Entity Framework vo ng dng ca bn
B2. Nhp chut phi vo th mc References trong ng dng ca bn thm mt
tham chiu n lp th vin bn va to

47

B3. Thm cu lnh:


using CodeFirstClass;

B4. To ra cc bn ghi mi:


HocVien h = new HocVien();
h.HocVienId = 29;
h.HoTen = "Nguyen Thi Ngoc Tram";
h.GioiTinh = false;
h.NgaySinh = DateTime.Parse("23/11/1992");
h.DiaChi = new DiaChi {SoNha="30",ThanhPho="Binh Thuan" };

LopHoc l = new LopHoc();


l.LopHocId = 03;
l.Mon = "Co so du lieu";
l.GioHoc = "14";

B5. To i tng context


QuanLyHocVienDBContext db = new QuanLyHocVienDBContext();

B6. Thm bn ghi v lu li vo c s d liu


db.HocViens.Add(h);

48

db.LopHocs.Add(l);
db.SaveChanges();

B7. Chy chng trnh v trong c s d liu s cha 2 bn ghi va to.

C s d liu ca bn s c t ng to v lu tr trong local SQLEXPRESS.


N s mc nh ly thuc tnh c tn Id lm kha chnh. cu hnh cc lp thc th,
.NET Framework cung cp cho cc bn h tr v DataAnnotation v Fluent API s
c gii thiu vo phn sau.
2.3.3.3

Khi to c s d liu - Database Initialization

Hnh 2.3 Cch Code first khi to d liu


-

Theo hnh trn, bn c th truyn cc tham s sau y trong base contructor:


49

Khng c tham s: Nu khng c tham s, n s to ra c s d liu trong


local SQLEXPRESS ca bn vi tn l <Namespace>.<Tn lp context>.
Trong v d trn l CodeFirstClass.QuanLyHocVienDBContext:
public class QuanLyHocVienDBContext : DbContext
{
public QuanLyHocVienDBContext()
: base()
{
}
}

Tn: nu truyn tham s l mt Name th c s d liu bn to ra s c


tn l tn tham s bn truyn vo
public class QuanLyHocVienDBContext : DbContext
{
public QuanLyHocVienDBContext()
: base("QuanLyHocVien2")
{
}
}

Tn chui kt ni ConnectionStringName: nu bn truyn mt chui kt


ni trong app.config hay web.config th c s d liu s c to ra theo
chui kt ni
public class QuanLyHocVienDBContext : DbContext
{
public QuanLyHocVienDBContext()
: base("QuanLyHocVienDBConnectionString")
{
}
}

App.config:
<connectionStrings>
<add name="QuanLyHocVienDBConnectionString"
providerName="System.Data.SqlClient"
connectionString="Server=.\SQLEXPRESS;
Database=QuanLyHocVien2;

50

Trusted_Connection=True"/>
</connectionStrings>

Vi chui kt ni ny, c s d liu s c lu vo server .\SQLEXPRESS


trong SQL Server vi tn l QuanLyHocVien2. Trong th connectionString phi lun
c providerName="System.Data.SqlClient"
2.3.3.4

Cc chin lc khi to c s d liu trong Code first

C s d liu s c to mi trong ln chy u tin, nhng n ln th hai tr


i th nh th no? N s to mi d liu bt c khi no ng dng c khi ng?
Lm th no thay i c s d liu khi bn thay i m hnh min?... x l cc tnh
hung, bn phi s dng mt trong nhng chin lc khi to c s d liu.
C bn cch c bn x l vn ny:
CreateDatabaseIfNotExists: nu c s d liu cha tn ti, b khi to

ny s to ra c s d liu mi cho bn. Nu c s d liu c to


trc , th ta s khng to na m s thao tc trn c s d liu c sn.
Tuy nhin khi thay i m hnh d liu, phng thc ny s nm ra mt
ngoi l.
DropCreateDatabaseIfModelChanges: Khi c s thay i v cc entity

class, b khi to ny s xa c s d liu c v to li mt c s d liu


mi theo s thay i cc lp thc th .
DropCreateDatabaseAlways: C s d liu c s c xa v to c s

d liu mi mi khi khi ng ng dng m khng quan tm ti m hnh


ca bn c b thay i hay khng.
Custom DB Initializer: Cho php bn khi to ty theo iu chnh ring

ca mnh nu cc cch trn khng p ng yu cu ca bn hoc bn mun


lm mt ci g khc khi n khi to c s d liu.
S dng cc chin lc khi to:
public QuanLyHocVienDBContext (): base("QuanLyHocVienDBConnectionString")
{
Database.SetInitializer< QuanLyHocVienDBContext>(new
CreateDatabaseIfNotExists<QuanLyHocVienDBContext>());

51

//Database.SetInitializer<QuanLyHocVienDBContext>(new
DropCreateDatabaseIfModelChanges<QuanLyHocVienDBContext>());

//Database.SetInitializer<QuanLyHocVienDBContext>(new
DropCreateDatabaseAlways<QuanLyHocVienDBContext>());

//Database.SetInitializer<QuanLyHocVienDBContext>(new
QuanLyHocVienDBContextInitializer());
}

Cc d liu c khi to u tin khi c s d liu ca bn c to li s c


nh ngha trong lp Seed. Nu bn mun lm thm nhng cng vic khc khi to c
s d liu bn s override li lp Seed.
public class QuanLyHocVienDBContextInitializer :
DropCreateDatabaseAlways<QuanLyHocVienDBContext>
{
protected override void Seed(QuanLyHocVienDBContext context)
{
//
//on code thm cc d liu khi to c s d liu
//
base.Seed(context);
}
}

Trong v d trn, cc d liu s c khi to sau mi ln khi ng ng dng do


c k tha t lp DropCreateDatabaseAlways
s dng vi Custom DB Initializer, lp khi to ca bn s k tha t
IDatabaseInitializer<Tn context>. V d:
public class QuanLyHocVienDBContextInitializer :
IDatabaseInitializer<QuanLyHocVienDBContext>
{
public void InitializeDatabase(QuanLyHocVienDBContext context)
{
if (context.Database.Exists())
{
if (!context.Database.CompatibleWithModel(true))
{
context.Database.Delete();

52

}
}
context.Database.Create();
}
}

S dng cc lp Seed vit li:

Database.SetInitializer<QuanLyHocVienDBContext>(new
QuanLyHocVienDBContextInitializer());

2.3.3.5

Cu hnh cc lp min trong Code first

c th to c s d liu t cc lp min do bn nh ngha th cc lp


phi tun theo mt s quy c theo c s d liu m EF c th hiu c v to ra
c s d liu cho bn. Gi s khi to ra mt lp Customer, ta khng ch nh kha
chnh nhng EF s mc nh ly thuc tnh c 2 k t cui Id lm kha (CustomerId)
nhng nu khng c th s bo li khng c kha. iu cn phi lm y l cu hnh
cc lp min.
C hai cch cu hnh:
-

S dng cc attribute ca DataAnnotation

S dng cc phng thc ca Fluent API

DataAnnotation
-

EF Code first cung cp cc thuc tnh (attributes) p dng vo cc lp min v


cc

thuc

tnh.

Bn

phi

khai

bo

khng

gian

tn

System.ComponentModel.DataAnnotations s dng cc attribute.


-

DataAnnotation bao gm cc attribute c bn cho vic kim chng pha my ch


v cc thuc tnh lin quan n c s d liu.

Mt s thuc tnh kim chng:


M t

Annotation
Attribute
Required

m bo cc thuc tnh phi c in d liu

MinLength

Quy nh di ti thiu ca k t
53

MaxLength

Quy nh di ti a ca k t

StringLength

Xc nh di ti thiu v ti a ca k t c cho php


trong mt trng d liu

Mt s thuc tnh lin quan n lc c s d liu:


Annotation
Attribute

Description

Table

Ch r tn bng m cc lp nh x

Column

Ch nh tn ct v kiu d liu c nh x bi cc thuc


tnh

Key

Cho bit thuc tnh l kha

ComplexType

nh du cc lp nh loi phc hp

ForeignKey

nh du kha ngoi

NotMapped

Cho bit thuc tnh s khng c nh x vi c s d


liu

V d:
[Table("DSHocVien")]
public class HocVien
{
[Key]
[Column("MaHocVien")]
public int HocVienId { get; set; }

[Required]
[StringLength(20)]
public string HoTen { get; set; }

[Required]
public bool GioiTinh { get; set; }

[Required]
public DateTime NgaySinh { get; set; }

public DiaChi DiaChi { get; set; }

[ForeignKey("LopHocId")]
public virtual ICollection<LopHoc> LopHocs { get; set; }

54

// Thuc tnh phc hp


[ComplexType]
public class DiaChi
{
public string SoNha { get; set; }
public string ThanhPho { get; set; }
}

Fluent API

Phng php ny cng s dng cu hnh cc lp min ca bn bng cch


override li phng thc OnModelCreating trong lp context.
public class QuanLyHocVienDBContext : DbContext
{
// Specify the name of the database as Rewards.
public QuanLyHocVienDBContext()
: base("QuanLyHocVienDBConnectionString")
{
}
// Create a database set for each of the data items.
public DbSet<HocVien> HocViens { get; set; }
public DbSet<LopHoc> LopHocs { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)


{
//Configure domain classes using Fluent API here
base.OnModelCreating(modelBuilder);
}
}

Mt s cch thc cu hnh thuc tnh nh x s dng Fluent API:


HasKey(): Thit lp thuc tnh kha
//Primary Key
modelBuilder.Entity<HocVien>().HasKey(h => h.HocVienId);
//Composite Primary Key
modelBuilder.Entity<HocVien>().HasKey(h => new {h.HocVienId,h.HoTen});

55

HasDatabaseGeneratedOption(): tt kiu kha t ng tng

modelBuilder.Entity<HocVien>().Property(h =>
h.HocVienId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

HasMaxLength(): Thit lp s k t ti a:
modelBuilder.Entity<HocVien>().Property(h=>h.HoTen).HasMaxLength(50);

IsRequired(): khng c rng


modelBuilder.Entity<HocVien>().Property(h=>h.HoTen).IsRequired();

Ignore(): Xc nh nhng thuc tnh, bng s khng c nh x qua c s


d liu
modelBuilder.Entity<HocVien>().Ignore(h => h.NgaySinh);
modelBuilder.Ignore<HocVien>();

HasColumnName(): Xc nh ct m thuc tnh nh x


modelBuilder.Entity<HocVien>().Property(h => h.HocVienId)
.HasColumnName("MaHocVien");

IsUnicode(): Cho php ni dung theo bng m Unicode


modelBuilder.Entity<HocVien>().Property(h=>h.HoTen).IsUnicode();

Cu hnh cho thuc tnh n ca cc loi phc hp:

modelBuilder.ComplexType<DiaChi>().Property(d=>d.ThanhPho).HasMaxLength(20);

hoc:
modelBuilder.Entity<HocVien>().Property(h=>h.DiaChi.SoNha).HasMaxLength(20);

Xc nh loi phc hp:


modelBuilder.ComplexType<DiaChi>();

ToTable(): nh x lp thc th thnh bng trong c s d liu:


modelBuilder.Entity<HocVien>().ToTable("DSHocVien");

2.3.3.6
-

Cu hnh cc lin kt

Lin kt 1 1
56

S dng DataAnnotation:
public class Student
{
public Student() { }

public int StudentId { get; set; }


[Required]
public string StudentName { get; set; }

[Required]
public virtual StudentAddress StudentAddress { get; set; }
}

public class StudentAddress


{
[Key, ForeignKey("Student")]
public int StudentId { get; set; }

public string Address1 { get; set; }


public string Address2 { get; set; }
public string City { get; set; }
public int Zipcode { get; set; }
public string State { get; set; }
public string Country { get; set; }

public virtual Student Student { get; set; }


}

S dng Fluent API:


protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<StudentAddress>()
.HasKey(e => e.StudentId);
modelBuilder.Entity<StudentAddress>().Property(e => e.StudentId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
modelBuilder.Entity<StudentAddress>()
.HasRequired(e => e.Student)
.WithRequiredDependent(s => s.StudentAddress);

base.OnModelCreating(modelBuilder);

57

Lin kt 1 nhiu
-

S dng DataAnnotation

public class Student


{
public Student() { }
public int StudentId { get; set; }
[Required]
public string StudentName { get; set; }
public int StdandardId { get; set; }

public virtual Standard Standard { get; set; }


}

public class Standard


{
public Standard()
{
}
public int StandardId { get; set; }
public string StandardName { get; set; }
public string Description { get; set; }

public virtual ICollection<Student> Students { get; set; }


}

S dng Fluent API

public class Student


{
public Student(){ }
public int StudentId { get; set; }
[Required]
public string StudentName { get; set; }
//StdId is not following code first conventions name
public int StdId { get; set; }
public virtual Standard Standard { get; set; }
}
public class Standard
{
public Standard()

58

{
StudentsList = new List<Student>();
}
public int StandardId { get; set; }
public string StandardName { get; set; }
public string Description { get; set; }

public virtual ICollection<Student> StudentsList { get; set; }


}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//one-to-many
modelBuilder.Entity<Student>().HasRequired<Standard>(s => s.Standard)
.WithMany(s => s.StudentsList).HasForeignKey(s => s.StdId);

Lin kt nhiu nhiu


-

S dng DataAnnotation

public class Student


{
public Student() { }
public int StudentId { get; set; }
[Required]
public string StudentName { get; set; }
public int StdandardId { get; set; }

public virtual ICollection<Course> Courses { get; set; }


}

public class Course


{
public Course()
{
}
public int CourseId { get; set; }
public string CourseName { get; set; }

public virtual ICollection<Student> Students { get; set; }


}

59

S dng Fluent API

protected override void OnModelCreating(DbModelBuilder modelBuilder)


{
modelBuilder.Entity<Student>()
.HasMany<Course>(s => s.Courses).WithMany(c => c.Students).Map(c =>
{
c.MapLeftKey("Student_id");
c.MapRightKey("Course_id");
c.ToTable("StudentAndCourse");
});
base.OnModelCreating(modelBuilder);
}

2.3.3.7
-

Migration

Migration
mt

khi

to

cng

nh

CreateDatabaseIfNotExists,

DropCreateDatabaseIfModelChanges v DropCreateDatabaseAlways.
-

c gii thiu trong EF 4.3.

Vi cc b khi to khc, khi ta thay i m hnh d liu, cc b khi to s nhn


ra c s khc bit gia m hnh trc v m hnh va thay i. to ra c s
d liu theo s thay i , cc b khi to s xa c s d liu c (nu bn vn
gi tn c s c cho s thay i) v to mi li. iu ny c ngha l bn s c mt
c s d liu hon ton mi v rng hoc c d liu do lp Seed bn override li.
Nu bn vn tn c s d liu c khi thay i th nhng d liu bn thm hay
sa c s d liu c s hon ton b mt. khc phc iu ny EF cung cp cho
bn b khi to Migration, n cho php cp nht li thay i ca c s d liu m
khng cn to mi li n.
Cc bc s dng Migration cp nht d liu
B1. Enable Migration, g lnh vo Package Manager Console: Enable-Migrations
B2. Thay i cc lp thc th
B3. Lu li cc s thay i thnh lp Migration: Add-Migration <Tn lp>
B4. Cp nht c s d liu bng cch g lnh: Update-database
V d
60

S dng li v d v Code-First. Trong bng hc vin ta c mt bn ghi:

Ta s s dng Migration thm mt trng in thoi vo bng:


B1. Enable Migration. Ta thc hin thay i trn lp ca th vin cha cc lp
nh ngha thc th. Do Default project s l th vin .

Sau khi enable, n s t ng thm vo project CodeFirstClass mt th mc


Migration cha cc lp Migration trong c mt lp Configuration c sn
phng thc Seed v mt lp InitialCreate nh ngha m hnh hin c ca ta.

B2. Thm thuc tnh in thoi vo lp HocVien


B3. Lu s thay i vo lp Migration v t tn lp l ThemDienThoai, g lnh:
Add-Migration ThemDienThoai

B4. Lp ThemDienThoai c to ra cha cc thng tin cp nht m hnh:

61

public partial class ThemDienThoai : DbMigration


{
public override void Up()
{
AddColumn("dbo.HocViens", "DienThoai", c => c.String());
}

public override void Down()


{
DropColumn("dbo.HocViens", "DienThoai");
}
}

Phng thc Up() cha thng tin s c cp nht vo c s d liu. Phng


thc Down() cha x l cc thng tin b thay i.
B5. Cp nht li c s d liu: Update-Database
Lnh update ny s thc hin cc phng thc Up()-Down() trong lp
Migration lu li sau cng. Ta c th thc hin nhng lp Migration lu trc
bng cch ch nh lp Migration thc hin update: Update-Database TargetMigration:"Tn lp"

B6. Build Solution. Ta c kt qu:

62

2.3.4
Loi c s
d liu

Chn la cc hng tip cn


La chn thit
k

Loi tip
cn

M t
Khi bn cn to mt c s d liu mi
v mun thy thit k trn form giao
din, s dng model-first l thch hp
nht. Trong model-first:

C s d
liu mi

Tp trung vo
thit k

Model first

To m hnh s dng .EDMX


designer
Yu cu EF to c s d liu t
m hnh ca bn
EF t ng sinh ra cc lp yu cu
tng tc vi c s d liu

Khi bn c sn mt c s d liu v
mun thy thit k ca n trong form
giao din, bn s dng database-first:
C s d
liu tn
ti

Tp trung vo
thit k

Database
first

Cung cp cho EF cc thng tin


gii m c s d liu c sn
to ra m hnh .EDMX
EF t ng sinh ra cc lp yu
cu tng tc vi c s d liu
Khi bn cn to mt c s d liu mi
v mun thit k chng bng cch s
dng code, bn s dng code-first:

C s d
liu mi

Tp trung vo
code

Code first

63

Bn nh ngha cc lp cho mi
bng trong c s d liu bng
cch s dng code
nh ngha s nh x cho cc lp
bn nh ngha vi c s d liu

Thit lp iu kin cho to v kt


ni ti c s d liu
EF t ng to ra c s d liu
khi run time
Khi bn c sn mt c s d liu v
mun tng tc vi n bng cch s
dng code, bn s dng code-first. S
dng code-first trong trng hp ny
C s d
liu tn
ti

cn c gi l code-second do bn
Tp trung vo
code

Code first

c sn c s d liu ri. Vic bn cn


lm l:
nh ngha cc bng trong c s
d liu thnh cc lp
Xy dng nh x cho cc lp vi
c s d liu

2.4 Thao tc vi entity s dng DBContext


2.4.1

Thm mt thc th

2.4.1.1

Thm mt thc th n

To i tng thc th cn thm vo c s d liu v gn cc gi tr cho cc


thuc tnh ca thc th:
// To i tng thc th Standard
var newStandard = new Standard();
newStandard.StandardName = "Standard 1";

64

To DBContext v thm vo tp thc th cha thc th. S dng phng thc


SaveChanges lu li cc thao tc va thc hin:
// To DBContext
using (var dbCtx = new SchoolDBEntities())
{
// Thm standards vo DBSet dng phng thc Add
dbCtx.Standards.Add(newStandard);
// gi phng thc SaveChange lu vo c s d liu
dbCtx.SaveChanges();
}

Thm thc th trong mi quan h 1 1

2.4.1.2

To i tng thc th Student:


// To i tng thc th Student
var student = new Student();
student.StudentName = "New Student1";

To thc th StudentAddress v gn vo thc th Student:


/* To i tng thc th StudentAddress v gn vo StudentAddress

trong student */
student.StudentAddress = new StudentAddress() {
Address1 = "Student1's Address1",
Address2 = "Student1's Address2",

65

City = "Student1's City",


State = "Student1's State" };

To DBContext v thm thc th Student vo tp cc thc th Students. S


dng phng thc Savechanges lu li cc thao tc.
//To i tng DBContext
using (var dbCtx = new SchoolDBEntities())
{
// Thm student vo DBSet dng phng thc Add
dbCtx.Students.Add(student);
/* Lu li s thay i */
dbCtx.SaveChanges();
}

Ta khng cn Add thc th StudentAddress v khi to thc th StudentAddress


ta gn n cho thuc tnh StudentAddress ca thc th Student.
2.4.1.3

Thm thc th trong mi quan h 1 nhiu

To mi cc thc th Standard v Teacher:


// To mi mt thc th Standard
var standard = new Standard();
standard.StandardName = "Standard1";
// To mi 3 thc th Teacher
var teacher1 = new Teacher();
teacher1.TeacherName = "New Teacher1";

66

var teacher2 = new Teacher();


teacher2.TeacherName = "New Teacher2";
var teacher3 = new Teacher();
teacher3.TeacherName = "New Teacher3";

Thm cc thc th Teacher vo tp cc thc th Teacher trong Standard:


// Thm cc Teacher vo Standard
standard.Teachers.Add(teacher1);
standard.Teachers.Add(teacher2);
standard.Teachers.Add(teacher3);

To DbContext v thm cc thc th vo:


using (var dbCtx = new SchoolDBEntities())
{
// Thm Standart vo DBSet
dbCtx.Standards.Add(standard);
// Lu li s thay i
dbCtx.SaveChanges();
}

2.4.1.4

Thm thc th trong mi quan h nhiu nhiu

To cc thc th Student v Course:


// To mi mt thc th Student
var student1 = new Student();
student1.StudentName = "New Student2";

67

// To ra cc thc th Course
var course1 = new Course();
course1.CourseName = "New Course1";
course1.Location = "City1";
var course2 = new Course();
course2.CourseName = "New Course2";
course2.Location = "City2";
var course3 = new Course();
course3.CourseName = "New Course3";
course3.Location = "City1";

Thm cc Course vo Student:


// Thm cc Course vo thc th Student
student1.Courses.Add(course1);
student1.Courses.Add(course2);
student1.Courses.Add(course3);

To DbContext v lu li:
using (var dbCtx = new SchoolDBEntities())
{
// Dng phng thc Add thm thc th DBSet
dbCtx.Students.Add(student1);
// Lu li thay i dng SaveChanges
dbCtx.SaveChanges();
}

2.4.2

Cp nht thc th

2.4.2.1 Cp nht thc th n


-

Ly ra thc th tn ti.

Thay i cc thuc tnh.


68

nh du trng thi ca thc th l Modified ( ch thc th b thay i).

Gi phng thc SaveChanges cp nht vo c s d liu.


Student stud ;
// Ly Student t c s d liu
using (var ctx = new SchoolDBEntities())
{
stud = ctx.Students.Where(s => s.StudentName == "New

Student1").FirstOrDefault<Student>();
}
// Thay i tn Student
if (stud != null)
{
stud.StudentName = "Updated Student1";
}
// Lu li s thay i
using (var dbCtx = new SchoolDBEntities())
{
// nh du thc th b thay i bng State
dbCtx.Entry(stud).State = System.Data.EntityState.Modified;
dbCtx.SaveChanges();
}
-

Ngoi cch s dng trng thi ca thc th, ta c th khng cn gn cc trng thi
cho cc thc th m gi lun phng thc SaveChanges lu li nhng thay i.
Student stud ;
// Ly Student t c s d liu
using (var ctx = new SchoolDBEntities())
{
stud = ctx.Students.Where(s => s.StudentName == "New

Student1").FirstOrDefault<Student>();
if (stud != null)
{

69

// Thay i tn Student
stud.StudentName = "Updated Student1";
// Lu li s thay i
ctx.SaveChanges();
}
}

2.4.2.2 Cp nht thc th trong mi quan h 1 1


Cc cp nht vi mi quan h mt mt:
Thm mt thc th mi vo lin kt ca thc th tn ti nu thc th tn

ti cha lin kt vi thc th khc. V d: thm mt StudentAddress vo


Student nu studentaddress cha c.
Thay i gi tr cc thc th tn ti. V d: thay i gi tr cc thuc tnh ca

StudentAddress ca mt Student.
Xa thc th c lin kt. v d: Xa StudentAddress ca mt Student.

V d:

using (var dbCtx = new SchoolDBEntities())


{
//Ly StudentAddress tn ti
StudentAddress existingStudentAddress =
dbCtx.StudentAddresses.AsNoTracking()
.Where(addr => addr.StudentID == stud.StudentID)
.FirstOrDefault<StudentAddress>();

//nh du Student s thay i


dbCtx.Entry(stud).State = System.Data.EntityState.Modified;

/*Nu StudentAddress tn ti (ly trn) khc rng th nh du


xa */
if (existingStudentAddress != null)

70

dbCtx.Entry<StudentAddress>(existingStudentAddress).State
= System.Data.EntityState.Deleted;

/* Nu Student c nh du thay i cha c StudentAddress khc


rng th thm StudentAddress ca Student vo c s d liu*/
if (stud.StudentAddress != null)
dbCtx.StudentAddresses.Add(stud.StudentAddress);
dbCtx.SaveChanges();
}

2.4.2.3 Cp nht thc th trong mi quan h mt nhiu


Cc cp nht vi mi quan h mt nhiu:
-

Thm mt lin kt mi. V d: Thm mt Teacher vo tp cc thc th teacher ca


mt Standard.

Thay i gi tr cc thuc tnh ca thc th pha nhiu. V d: Chnh sa Teacher


tn ti trong tp cc teacher ca mt Standard.

Xa thc mt thc th nhiu ra khi tp thc th. V d: Xa mt Teacher ra khi


tp hp teacher ca Standard.
V d:

using (var dbCtx = new SchoolDBEntities())


{
//1- Ly thc th Student t c s d liu
var existingStudent = dbCtx.Students.AsNoTracking().Include(s
=> s.Standard).Include(s => s.Standard.Teachers).Where(s => s.StudentName
== "updated student").FirstOrDefault<Student>();
var existingTeachers =
existingStudent.Standard.Teachers.ToList<Teacher>();
var updatedTeachers = teachers.ToList<Teacher>();
//2- Ly danh sch teacher c thm vo
var addedTeachers = updatedTeachers.Except(existingTeachers,
tchr => tchr.TeacherId);

71

//3- Ly danh sch teacher s b xa


var deletedTeachers = existingTeachers.Except(updatedTeachers,
tchr => tchr.TeacherId);
//4- Ly danh sch teacher s b thay i
var modifiedTeacher = updatedTeachers.Except(addedTeachers,
tchr => tchr.TeacherId);
//5- nh du cc teacher thm vo
addedTeachers.ToList<Teacher>().ForEach(tchr =>
dbCtx.Entry(tchr).State = System.Data.EntityState.Added);
//6- nh du cc teacher s b xa
deletedTeachers.ToList<Teacher>().ForEach(tchr =>
dbCtx.Entry(tchr).State = System.Data.EntityState.Deleted);

//7- Thay i cc gi tr ca teacher s sa i thnh //gi


tr ca teacher c
foreach(Teacher teacher in modifiedTeacher)
{
//8- Tm cc teacher c theo Id t c s d liu
var existingTeacher =
dbCtx.Teachers.Find(teacher.TeacherId);
if (existingTeacher != null)
{
//9- Ly cc gi tr ca teacher tn ti
var teacherEntry = dbCtx.Entry(existingTeacher);
//10- Ghi nhng thuc tnh c ca
//existingTeacher ln teacher
teacherEntry.CurrentValues.SetValues(teacher);
}
}
//11- Lu li nhng thay i
dbCtx.SaveChanges();
}

2.4.2.4 Cp nht thc th trong mi quan h nhiu nhiu


Cc cp nht vi mi quan h nhiu nhiu:

72

Thm cc lin kt mi. V d: Thm cc Course cho Student, d l Course


mi hay tn ti trong c s d liu.

C th loi b mt s thc th trong tp lin kt. Ngi dng c th loi b mt


s cc Course t b su tp Course hin c ca Student.

V d:
using (var dbCtx = new SchoolDBEntities())
{
/* 1- Ly d liu t c s d liu */
var existingStudent = dbCtx.Students.Include("Courses")
.Where(s => s.StudentName == stud.StudentName)
.FirstOrDefault<Student>();
/* 2- Tm danh sch kha hc s b xa bng cch ly danh
sch kha hc hin ti i danh sch kha hc tn ti*/
var deletedCourses =
existingStudent.Courses.Except(stud.Courses,
cours => cours.CourseId).ToList<Course>();
/* 3- Tm danh sch kha hc c thm vo bng cch ly
danh sch kha hc hin ti danh sch kha hc c sn */
var addedCourses =
stud.Courses.Except(existingStudent.Courses,
cours => cours.CourseId).ToList<Course>();
/* 4- Xa cc kha hc ra khi b tp kha hc ca sinh
vin
deletedCourses.ForEach(c =>
existingStudent.Courses.Remove(c));
//5- Thm kha hc mi
foreach(Course c in addedCourses)
{
/*6- Thm nhng kha hc mi vo tp cc kha hc nu
nh cha c*/
if (dbCtx.Entry(c).State ==
System.Data.EntityState.Detached)
dbCtx.Courses.Attach(c);
//7- Thm vo tp kha hc ca sinh vin

73

existingStudent.Courses.Add(c);
}
//8- Lu thay i
dbCtx.SaveChanges();
}

2.4.3

Xa thc th

Ly ra thc th cn xa.

Gi phng thc Remove.

Gi phng thc SaveChanges lu li.


using (var dbCtx = new SchoolDBEntities())
{
//Ly thc th cn xa v dng phng thc Remove xa
var newtchr = dbCtx.Teachers
.Where(t => t.TeacherName == "New teacher4")
.FirstOrDefault<Teacher>();
dbCtx.Teachers.Remove(newtchr);
//Ngoi ra cn c th s dng trng thi State = Deleted:
//dbCtx.Entry(tchr).State = System.Data.EntityState.Deleted;
//Lu li s thay i
dbCtx.SaveChanges();
}

2.5 Cc tnh nng mi ca Entity Framework 5.0


2.5.1
-

To lp DBContext trong Entity Framework 5.0

Khi s dng EF 5.0 v Visual 2012 to m hnh t mt c s d liu c sn


(theo hng tip cn Database-first). N s c t ng to ra lp DbContext
v cc thc th POCO m khng cn Add Code Generator Item

Trong v d v hng Database-first nu trc, khi to m hnh t c s


QuanLyHocVien c sn, n t ng sinh ra cc lp DbContext v cc lp
nh ngha cc thc th:

74

2.5.2
-

Kiu Enum trong EF 5.0

Bn c th c kiu Enum trong project Entity Framework 5.0 trn .NET


Framework 4.5.

Enum ch c to cho cc kiu d liu:


Int16
Int32
Int64
Byte
Sbyte

C 3 cch to v s dng kiu Enum trong m hnh thc th d liu bng 3 cch:
Chuyn i mt thuc tnh c sn ca thc th thnh Enum t EDM
designer.
Thm Enum mi t EDM designer.
S dng kiu Enum t mt khng gian tn khc.
2.5.2.1

Chuyn i mt thuc tnh thnh kiu Enum

Nhp tri vo thuc tnh c th c kiu Enum, chn Convert to Enum.

75

Hp thoi Add Enum Type xut hin, bn nh tn Enum vo trng Enum


Type Name v chn Underlying Type.

Thm cc thnh vin trong Enum v gi tr ca cc thnh vin.

Sau khi chuyn thnh Enum, bn c th thy MonHocType trong Enum Type
trong Model Brower.

76

Trong Properties ca mn hc ta thy kiu ca n l MonHocType.

2.5.2.2

Thm Enum mi t EDM Design

Click phi vo vng EDM Design chn Add New | Enum Type.

Nhp cc gi tr cho Enum nh phn trc trong hp thoi Add Enum Type.

Sau Enum ny s xut hin trong th mc Enum Types trong Model Browser.

Bn c th gn kiu Enum va mi to cho cc thuc tnh trong Model ca bn


bng cc iu chnh mc Type trong Properties ca thuc tnh l tn ca kiu
Enum bn mun gn.

77

2.5.2.3
-

S dng Enum t mt khng gian tn khc

Nu bn nh ngha 1 kiu Enum trong code ca bn, bn c th thm kiu


Enum vo m hnh ca bn.

Click phi vo vng EDM Design chn Add New | Enum Type.

Nhp tn kiu Enum.

Tham chiu n kiu Enum bn to ra bng code bng cch nh du vo mc


Reference extenal Type v in : <Tn namespace cha enum m bn nh
ngha>.<Tn kiu Enum bn nh ngha>

Sau bn ch vic gn kiu Enum ny vo thuc tnh bn mun.

S dng kiu Enum


LopHoc l = new LopHoc();
l.LopHocId = 02;
l.MonHoc = MonHocType.CoSoDuLieu;
l.Gio = "7";

2.5.3
-

Spatial Data type

MS SQL Server 2008 cung cp kiu d liu khng gian a l i din cho d liu
trong mt h ta v hnh hc vng quanh tri t m d liu i din nm trong
mt h ta Euclide (phng).

thao tc vi cc kiu d liu khng gian, EF 5.0 cung cp loi d liu:


DbGeography v DbGeometry.

chnh cc thuc tnh trong m hnh ca bn c kiu ta , trong Properties ca


thuc tnh bn iu chnh Type l cc kiu ta (Geography, Geometry). Hoc
bn c th nh ngha trong Code:
public partial class Course
{
public Course()
{
this.Students = new HashSet<Student>();
}
public int CourseId { get; set; }

78

public string CourseName { get; set; }


public Nullable<int> TeacherId { get; set; }
public System.Data.Spatial.DbGeography Location { get; set; }
public virtual Teacher Teacher { get; set; }
public virtual ICollection<Student> Students { get; set; }
}
-

S dng:
ctx.Courses.Add(new Course() { CourseName = "New Course",
Location = DbGeography.FromText("POINT(-122.360 47.656)") });
ctx.SaveChanges();

2.5.4
-

Table-Valued Function

Table-Valued Function (TVF) tng t nh th tc lu tr vi mt s khc bit


quan trng: kt qu ca TVF l composable c ngha l kt qu ca TVF c th
c s dng trong mt truy vn LINQ.

Cch thm cc Table-Valued Function vo m hnh thc th DatabaseFirst m ta


thc hin:
Trong CSDL, ta c Table-Valued Function LayDSLopHocCuaHocVien vi
i s l HocVienId. Hm ny s ly ra thng tin cc lp hc m hc vin c Id
mun tm tham gia:

USE [QuanLyHocVien]
GO
/****** Object:
******/

UserDefinedFunction [dbo].[LayDSLopHocCuaHocVien]

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[LayDSLopHocCuaHocVien]
(
-- Add the parameters for the function here
@HocVienId int
)
RETURNS TABLE
AS

79

RETURN
(
-- Add the SELECT statement with parameter references here
select c.Mon, c.GioHoc
from HocVien s left outer join HocVienLopHoc sc on
sc.HocVien_HocVienId = s.HocVienId join LopHoc c on
c.LopHocId=sc.LopHoc_LopHocId
where s.HocVienId = @HocVienId
)

Thm TVF bng cc click phi vo vng EDM Design ca m hnh v chn
Update Model from Database.
Trong hp thoi Update Wizard chn LayDSLopHocCuaHocVien ti Stored
Proceduces and Functions.

Chn Finish.
Bn s thy TVF LayDSLopHocCuaHocVien c hin th trong th mc
Function Imports v Stored Proceduces/Functions trong Model Browser.
Trong th mc Function Imports, click phi vo TVF va thm v chn Edit.
Chn kiu tr v ca TVF. Nu TVF ca bn tr v mt gi tr, chn Scalars
v chn kiu gi tr. Nu l mt tp hp cc record, chn Complex v t tn
80

i tng s cha cc bn record. Nu tr v thc th c cng cu trc vi thc


th c sn trong m hnh, chn Entites v chn tn Entity cng cu trc. Trong
v d ny, kiu tr v l mt Complex v i tng cha n l
LayDSLopHocCuaHocVien_Result.

S dng TVF:

using (QuanLyHocVien2Entities db = new QuanLyHocVien2Entities())


{
var courseList =
db.LayDSLopHocCuaHocVien(1).Where(c=>c.GioHoc=="14").ToList<LayDSLopHocCuaH
ocVien_Result>();
foreach (LayDSLopHocCuaHocVien_Result cs in courseList)
Console.WriteLine("Ten Mon: {0}, Gio Hoc: {1}", cs.Mon, cs.GioHoc);
}

81

2.5.5
-

Batch Import of Stored Procedures

Trong EF 5.0 cho php bn thm vo m hnh cng mt lc nhiu th tc lu tr


thng qua Entity Data Model Wizard sau khi nh du vo Import selected
stored procedures and functions into the entity model. Ta c thm update vo
m hnh cc th tc tng t nh lm vi TVF.

Sau khi thm cc th tc lu tr, bn cng Edit n tng t nh TVF.

chc chn rng khi chy cc th tc lu tr s khng a ra li bn cn xc


nhn n bng cch nhp phi chut vo th tc lu tr trong th mc Fuction
Imports v chn Validate.
2.5.6
-

Multiple diagrams

Visual Studio 2012 cho php bn phn chia m hnh d liu thc th thnh
nhiu s . Vic ny s gip bn d quan st cc s v mi quan h ca
82

chng d dng hn khi m hnh thc th d liu ca bn tr nn ln. Mi s


c th cha mt phn ca m hnh d liu thc th. Gi s bn c th to ra s
HocVien ch gm cc thc th hc vin v cc thc th c lin quan ti hc
vin, cn nhng thc th khng lin quan bn khng a vo. Mc ch ca
vic tch cc thnh cc s ny bn c th quan st s ca hc vin khi
cn thit m khng phi b kh nhn bi s c mt ca cc thc th v cc mi
quan h khng lin quan.
-

Vic tch m hnh ra thnh nhiu s khng lm nh hng ti c s d liu.

Cc cch to ra cc s mi:
To mt s mi v ko th cc thc th t Model Browser vo.
Di chuyn mt thc th ti m hnh c vo m hnh mi.
2.5.6.1

To mt s mi v ko th cc thc th vo

Click phi vo th mc Diagrams trong Model Browser v cho Add New


Diagram.

Bn c th i tn cc s va to.

Ko cc thc th t Model Browser v th vo s ca bn.

83

2.5.6.1

Di chuyn thc th t s c sn

Click phi vo thc th v chn Move to new Diagram.

a nhng thc th c quan h vi mt thc th ang trong mt s no


, click chut phi vo thc th trong s v chn Include Related.
84

Khi khng mun thc th nm trong s na, click phi vo thc th v


chn Remove from Diagram. Nu bn chn Delete from Model th thc th
s khng cn trong m hnh d liu thc th ca bn v bn khng th s
dng thc th c na.

2.5.7

T mu cho cc thc th trong EDM Designer

Click phi vo thc th mun t mu chn Properties.

Trong ca s Properties chn mu cho thc th ti mc Fill Color.

85

You might also like