專(zhuān)家分析ADO.NET Debug使用問(wèn)題
一旦該entity Key對(duì)應(yīng)的實(shí)體已被加載,ADO.NET Debug就不會(huì)重復(fù)去數(shù)據(jù)庫(kù)去取了,如果該entity key對(duì)應(yīng)實(shí)體沒(méi)有被加載,就會(huì)去數(shù)據(jù)庫(kù)去取.所以增加這樣一個(gè)判斷,下面就對(duì)于ADO.NET Debug進(jìn)行詳細(xì)說(shuō)明。
在上一文末寫(xiě)了幾個(gè)關(guān)于用Include加載多級(jí)實(shí)體的查詢(xún),不過(guò)前天在forums.mircosoft.com看到一個(gè)關(guān)ADO.NET Debug加載多級(jí)實(shí)體的問(wèn)題,經(jīng)過(guò)一番交流和測(cè)試,算是明白了所以然.雖然自己常常在那樣寫(xiě)Linq To Entity查詢(xún),也許是因?yàn)樵谑褂玫倪^(guò)程中沒(méi)有遇到棘手的問(wèn)題,所以也沒(méi)去多想.
在本文之前,還是先說(shuō)說(shuō)那個(gè)問(wèn)題.在edm中這樣的一個(gè)關(guān)系:Customers 1 --- * Orders * --- 1 Status,在這個(gè)關(guān)系下面做這樣一個(gè)查詢(xún) var = query from customer in Customers.Include("Orders.Status") select customer,在調(diào)試的時(shí)候他發(fā)現(xiàn)Customer的Order被及時(shí)加載(ADO.NET Debug卻沒(méi)有.所以問(wèn)題人覺(jué)得這是不是EF在設(shè)計(jì)上的緣故,還是其他什么原因.我告訴他不是設(shè)計(jì)上的原因,因?yàn)槲揖统D敲磳?xiě),當(dāng)然標(biāo)準(zhǔn)的寫(xiě)法是Inclue("Orders").Include("Orders.Status").#t#
之前我在adonot blog上看到關(guān)于ADO.NET Debug與 Linq to Entity 在Eager Loading方式上的區(qū)別,也見(jiàn)過(guò)那樣寫(xiě),當(dāng)然最關(guān)鍵的,我那樣做查詢(xún)沒(méi)有出先上述的問(wèn)題.不過(guò)我還是在想,難道這個(gè)查詢(xún)出現(xiàn)問(wèn)題是和模型的1:n:1關(guān)系有關(guān)嗎?
以前都沒(méi)在意這些,我在使用過(guò)類(lèi)似這種查詢(xún)的地方,的確沒(méi)有符合這種關(guān)系.于是我昨天做了一個(gè)測(cè)試在Northwind里面恰好有Products 1--* OrderDetails *--1 Orders 符合條件的一組關(guān)系,并做了寫(xiě)了如下的代碼,一邊debug,一邊跟蹤數(shù)據(jù)庫(kù),的確只生成一條sql.后來(lái)我又選了1:n:n以及ADO.NET Debug的關(guān)系組也均都只生成一條sql.