熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ADO.NET Framework beta 3和Linq 

2013-11-13 10:33:44  來源: .NET編程 

  Linq to SQL內置緩存功能簡單的說當你查詢了一次某個鍵的數據後再次查詢時Linq to SQL的引擎不再向數據庫發送SQL例如

  

  

  //下面是使用LinQ to SQL 的例子context是派生自SystemDataLinqDataContext的實例
ErpLinQContextDataContext context = new ErpLinQContextDataContext();
//SQLServer事件探查器攔截到SQL語句的執行
//exec sp_executesql NSELECT TOP [t][emp_id] [t][fname]

  [t][minit] [t][lname]
//                         [t][job_id] [t][job_lvl]

  [t][pub_id] [t][hire_date]
//FROM [dbo][employee] AS [t]
//WHERE [t][emp_id] = @p N@p varchar() @p = PMAM
employee p = contextemployeesFirst(p => pemp_id == PMAM);
//當我再次執行相同的查詢時LinQ to SQL 不再向SQL Server發送查詢了
employee p = contextemployeesFirst(p => pemp_id == PMAM);

  而且這兩個實例是同一個實例

  

  

  //返回的對象是同一個實例
bool b = objectReferenceEquals(p p); //=true;
plname = New Last Name;
bool b = (plname == New Last Name);  //=true;

  當然如果你使用不同的Context實例查詢時緩存功能將實效

  好讓我們再看看ADONET Entity Framework beta

  

  

  //pubsEntites是 ADONET Entity Framework 的SystemDataObjectsObjectContext派生對象
pubsEntities context = new pubsEntities();

  //下面語句執行時SQLServer事件探查器攔截到SQL的執行
//SELECT TOP [Extent][emp_id] AS [emp_id] [Extent][fname] AS [fname]

  [Extent][lname] AS [lname]
//             [Extent][hire_date] AS [hire_date] [Extent][job_id] AS

  [job_id] [Extent][pub_id] AS [pub_id]
//FROM [dbo][employee] AS [Extent]
//WHERE NPMAM = [Extent][emp_id]
Employee p = contextEmployeeSetFirst(p => pEmployeeId == PMAM);

  //SQLServer事件探查器 發現SQL再次被執行
Employee p = contextEmployeeSetFirst(p => pEmployeeId == PMAM);
//測試發現雖然ADONET Entity Framework執行了兩次SQL但是他們卻返回了完全相同的實例
bool b = objectReferenceEquals(p p); // = true;

  測試的結果是ADONET Entity Framework(以下簡稱AEF)沒有使用緩存而是再次執行SQL但是你要注意兩次查詢的實例竟然是同一個

  從Context功能上看他肯定持有上次查詢的結果他沒有使用緩存我只能認為可能AEF被設計成三層應用那麼他很擔心其他的進程將數據改了所以不使用緩存當發現數據並沒有改後還是使用原先的實例這個想法對嗎?

  我們再看看另外一個代碼

  

  

  //如果使用不同的上下文更新的數據
pubsEntities context = new pubsEntities();
Employee p = contextEmployeeSetFirst(p => pEmployeeId == PMAM);
pLastName = Context changed data;
contextSaveChanges();

  //舊的context再次查詢時
Employee p = contextEmployeeSetFirst(p => pEmployeeId == PMAM);
b = objectReferenceEquals(p p); //= true   why??
b = (pLastName == Context changed data); //= false 

  pLastName = New Last Name

  難以置信AEF重新執行了SQL但是置新的更改而不聞仍然返回舊的數據這個算是Bug嗎?

  我不知道哪位達人能夠解釋這個問題?當然這個問題我也詢問了MS他們的技術人員還未做出滿意的答復


From:http://tw.wingwit.com/Article/program/net/201311/13995.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.