LINQ to SQL Part 2Defining our Data Model Classes.docx
- 文档编号:14100624
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:13
- 大小:344.03KB
LINQ to SQL Part 2Defining our Data Model Classes.docx
《LINQ to SQL Part 2Defining our Data Model Classes.docx》由会员分享,可在线阅读,更多相关《LINQ to SQL Part 2Defining our Data Model Classes.docx(13页珍藏版)》请在冰点文库上搜索。
LINQtoSQLPart2DefiningourDataModelClasses
LINQtoSQL(Part2-DefiningourDataModelClasses)
InPart1ofmyLINQtoSQLblogpostseriesIdiscussed"WhatisLINQtoSQL"andprovidedabasicoverviewofsomeofthedatascenariositenables.
InmyfirstpostIprovidedcodesamplesthatdemonstratedhowtoperformcommondatascenariosusingLINQtoSQLincluding:
∙Howtoqueryadatabase
∙Howtoupdaterowsinadatabase
∙Howtoinsertandrelatemultiplerowsinadatabase
∙Howtodeleterowsinadatabase
∙Howtocallastoredprocedure
∙Howtoretrievedatawithserver-sidepaging
IperformedallofthesedatascenariosusingaLINQtoSQLclassmodelthatlookedliketheonebelow:
InthissecondblogpostintheseriesI'mgoingtogointomoredetailonhowtocreatetheaboveLINQtoSQLdatamodel.
LINQtoSQL,theLINQtoSQLDesigner,andallofthefeaturesthatI'mcoveringinthisblogpostserieswillshipaspartofthe.NET3.5andVisualStudio"Orcas"release.
YoucanfollowallofthestepsbelowbydownloadingeitherVisualStudio"Orcas"Beta1orVisualWebDeveloperExpress"Orcas"Beta1.Bothcanbeinstalledandusedside-by-sidewithVS2005.
CreateaNewLINQtoSQLDataModel
YoucanaddaLINQtoSQLdatamodeltoanASP.NET,ClassLibraryorWindowsclientprojectbyusingthe"AddNewItem"optionwithinVisualStudioandselectingthe"LINQtoSQL"itemwithinit:
Selectingthe"LINQtoSQL"itemwilllaunchtheLINQtoSQLdesigner,andallowyoutomodelclassesthatrepresentarelationaldatabase.Itwillalsocreateastrongly-typed"DataContext"classthatwillhavepropertiesthatrepresenteachTablewemodeledwithinthedatabase,aswellasmethodsforeachStoredProcedurewemodeled.AsIdescribedinPart1ofthisblogpostseries,theDataContextclassisthemainconduitbywhichwe'llqueryentitiesfromthedatabaseaswellasapplychangesbacktoit.
Belowisascreen-shotofanemptyLINQtoSQLORMdesignersurface,andiswhatyou'llseeimmediatelyaftercreatinganewLINQtoSQLdatamodel:
EntityClasses
LINQtoSQLenablesyoutomodelclassesthatmapto/fromadatabase.Theseclassesaretypicallyreferredtoas"EntityClasses"andinstancesofthemarecalled"Entities".Entityclassesmaptotableswithinadatabase.Thepropertiesofentityclassestypicallymaptothetable'scolumns.Eachinstanceofanentityclassthenrepresentsarowwithinthedatabasetable.
EntityclassesdefinedwithLINQtoSQLdonothavetoderivefromaspecificbaseclass,whichmeansthatyoucanhavetheminheritfromanyobjectyouwant.AllclassescreatedusingtheLINQtoSQLdesigneraredefinedas"partialclasses"-whichmeansthatyoucanoptionallydropintocodeandaddadditionalproperties,methodsandeventstothem.
UnliketheDataSet/TableAdapterfeatureprovidedinVS2005,whenusingtheLINQtoSQLdesigneryoudonothavetospecifytheSQLqueriestousewhencreatingyourdatamodelandaccesslayer.
Instead,youfocusondefiningyourentityclasses,howtheymapto/fromthedatabase,andtherelationshipsbetweenthem.TheLINQtoSQLOR/MimplementationwillthentakecareofgeneratingtheappropriateSQLexecutionlogicforyouatruntimewhenyouinteractandusethedataentities.YoucanuseLINQquerysyntaxtoexpressivelyindicatehowtoqueryyourdatamodelinastronglytypedway.
CreatingEntityClassesFromaDatabase
Ifyoualreadyhaveadatabaseschemadefined,youcanuseittoquicklycreateLINQtoSQLentityclassesmodeledoffofit.
TheeasiestwaytoaccomplishthisistoopenupadatabaseintheServerExplorerwithinVisualStudio,selecttheTablesandViewsyouwanttomodelinit,anddrag/dropthemontotheLINQtoSQLdesignersurface:
Whenyouaddtheabove2tables(CategoriesandProducts)and1view(Invoices)fromthe"Northwind"databaseontotheLINQtoSQLdesignersurface,you'llautomaticallyhavethefollowingthreeentityclassescreatedforyoubasedonthedatabaseschema:
Usingthedatamodelclassesdefinedabove,Icannowrunallofthecodesamples(expecttheSPROCone)describedinPart1ofthisLINQtoSQLseries.Idon'tneedtoaddanyadditionalcodeorconfigurationinordertoenablethesequery,insert,update,delete,andserver-sidepagingscenarios.
NamingandPluralization
Oneofthethingsyou'llnoticewhenusingtheLINQtoSQLdesigneristhatitautomatically"pluralizes"thevarioustableandcolumnnameswhenitcreatesentityclassesbasedonyourdatabaseschema.Forexample:
the"Products"tableinourexampleaboveresultedina"Product"class,andthe"Categories"tableresultedina"Category"class.Thisclassnaminghelpsmakeyourmodelsconsistentwiththe.NETnamingconventions,andIusuallyfindhavingthedesignerfixtheseupformereallyconvenient(especiallywhenaddinglotsoftablestoyourmodel).
Ifyoudon'tlikethenameofaclassorpropertythatthedesignergenerates,though,youcanalwaysoverrideitandchangeittoanynameyouwant.Youcandothiseitherbyeditingtheentity/propertynamein-linewithinthedesignerorbymodifyingitviathepropertygrid:
Theabilitytohaveentity/property/associationnamesbedifferentfromyourdatabaseschemaendsupbeingveryusefulinanumberofcases.Inparticular:
1)Whenyourbackenddatabasetable/columnschemanameschange.Becauseyourentitymodelscanhavedifferentnamesfromthebackendschema,youcandecidetojustupdateyourmappingrulesandnotupdateyourapplicationorquerycodetousethenewtable/columnname.
2)Whenyouhavedatabaseschemanamesthataren'tvery"clean".Forexample,ratherthanuse"au_lname"and"au_fname"forthepropertynamesonanentityclass,youcanjustnamethemto"LastName"and"FirstName"onyourentityclassanddevelopagainstthatinstead(withouthavingtorenamethecolumnnamesinthedatabase).
RelationshipAssociations
WhenyoudragobjectsfromtheserverexplorerontotheLINQtoSQLdesigner,VisualStudiowillinspecttheprimarykey/foreignkeyrelationshipsoftheobjects,andbasedonthemautomaticallycreatedefault"relationshipassociations"betweenthedifferententityclassesitcreates.Forexample,whenIaddedboththeProductsandCategoriestablesfromNorthwindontomyLINQtoSQLdesigneryoucanseethataonetomanyrelationshipbetweenthetwoisinferred(thisisdenotedbythearrowinthedesigner):
TheaboveassociationwillcausecausetheProductentityclasstohavea"Category"propertythatdeveloperscanusetoaccesstheCategoryentityforagivenProduct.ItwillalsocausetheCategoryclasstohavea"Products"collectionthatenablesdeveloperstoretrieveallproductswithinthatCategory.
Ifyoudon'tlikehowthedesignerhasmodeledornamedanassociation,youcanalwaysoverrideit.Justclickontheassociationarrowwithinthedesignerandaccessitspropertiesviathepropertygridtorename,deleteormodifyit.
Delay/LazyLoading
LINQtoSQLenablesdeveloperstospecifywhetherthepropertiesonentitiesshouldbeprefetchedordelay/lazy-loadedonfirstaccess.Youcancustomizethedefaultpre-fetch/delay-loadrulesforentitypropertiesbyselectinganyentitypropertyorassociationinthedesigner,andthenwithintheproperty-gridsetthe"DelayLoaded"propertytotrueorfalse.
ForasimpleexampleofwhenI'dwantto-dothis,considerthe"Category"entityclasswemodeledabove.Thecategoriestableinside"Northwind"hasa"Picture"columnwhichstoresa(potentiallylarge)binaryimageofeachcategory,andIonlywanttoretrievethebinaryimagefromthedatabasewhenI'mactuallyusingit(andnotwhendoingasimplyqueryjusttolistthecategorynamesinalist).
IcouldconfigurethePicturepropertytobedelayloadedbyselectingitwithintheLINQtoSQLdesignerandbysettingsitsDelayLoadedvalueinthepropertygrid:
Note:
Inadditiontoconfiguringthedefaultpre-fetch/delayloadsemanticsonentities,youcanalsooverridethemviacodewhenyouperformLINQqueriesontheentityclass(I'llshowhowto-dothisinthenextblogpostinthisseries).
UsingStoredProcedures
LINQtoSQLallowsyoutooptionallymodelstoredproceduresasmethodsonyourDataContextclass.Forexample,assumewe'vedefinedthesimpleSPROCbelowtoretrieveproductinformationbasedonacategoryID:
IcanusetheserverexplorerwithinVisualStudiotodrag/droptheSPROContotheLINQtoSQLdesignersurfaceinordertoaddastrongly-typedmethodthatwillinvoketheSPROC.IfIdroptheSPROContopofthe"Product"entityinthedesigner,theLINQtoSQLdesignerwilldeclaretheSPROCtoreturnanIEnumerable
IcanthenuseeitherLINQQuerySyntax(whichwillgenerateanadhocSQLquery)oralternativelyinvoketheSPROCmethodaddedabovetoretrieveproductentitiesfromthedatabase:
UsingSPROCstoUpdate/Delete/InsertData
BydefaultLINQtoSQLwillautomaticallycreatetheappropriateSQLexpressionsforyouwhenyouinsert/update/deleteentities.Forexample,ifyouwrotetheLINQtoSQLcodebelowtoupdatesomevaluesona"Product"entityinstance:
BydefaultLINQtoSQLwouldcreateandexecutetheappropriate"UPDATE"statementforyouwhenyousubmittedthechanges(I'llcoverthismoreinalaterblogpostonupdates).
YoucanalsooptionallydefineandusecustomINSERT,UPDATE,DELETEsprocsinstead.Toconfigurethese,justclickonanentityclassintheLINQtoSQLdesignerandwithinitsproperty-gridclickthe"..."buttonontheDelete/Insert/Updatevalues,andpickaparticularSPROCyou'vedefinedinstead:
Whatisniceaboutchangingtheabovesettingisthatitisdonepurelyatthemappinglayer
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LINQ to SQL Part Defining our Data Model Classes
链接地址:https://www.bingdoc.com/p-14100624.html