昨天由於時間有限,還剩余一些後續,為了保持自己每日總結寫博客的習慣,今天來完善昨天的內容,那關於LinQ技術的基礎基本上講完了,剩余的就是看我們在運用中如何將它發揮到極致了。
1、LinQ to Entity的並發管理機制
2、LinQ to DataSet的實現
3、EntityDataSource控件
1、 首先,我將LinQ to Entity的並發機制畫了一個草圖,結合昨天博客中說道的它的實現機制,就很容易理解這一點。
其實LinQ to Entity技術可以歸結為一句:就是將數據庫對象--映射為一個類,而數據庫中的每一行數據就是這個類的一個對象,然後全部映射到內存中,采用LinQ表達式,在解析LinQ表達式之後會將操作的對象對應的數據加載到內存,在內存中作為一個臨時備份進行預期的數據修改,然後統一提交Entity FrameWork解析為最終的SQL語句,統一執行更新。
但正是這一點導致了它一個致命的缺陷:在你LinQ表達式執行更新前,數據庫中該記錄由於其他操作比如ADO.NET方式已經發生更新,就導致此時你操作的內存數據已經不是最新的了。而如果提交SaveChange()就會拋出OptimisticConcurrencyException異常。
我們來看一下昨天的一個示例代碼:更新一個記錄
//將剛才插入的客戶名【無涯子】改為【哈哈哈】 public void updateData() { //實例化數據庫對象ObjectContext NorthwindEntities myTestDB = new NorthwindEntities(); Customer data = (from customer in myTestDB.Customers where customer.CustomerID == "george" select customer).Single(); //操作內存數據 data.ContactName="哈哈哈"; //假設以下采用其他方式已經更新了數據庫中的ContactName updataNameByADOnet(strSQL);//這裡是虛擬的一個更新 try{ //提交數據更新 myTestDB.SaveChanges();
}
catch(OptimisticConcurrencyException e){
} }
LinQ to Entity由於只涉及內存資源而無法訪問數據庫服務器所以無法做到數據對象鎖定。但是也提供了一個解決辦法,就是為每一個映射到源代碼環境的對象字段添加了一個CurrencyMode屬性,用於設置是否對該字段校驗並發。但是需要一個個 字段的去設置……這無疑是個痛苦的過程。。。。
為了保持內存數據與數據庫數據的一致性,ObjectContent對象提供了一個Refresh()方法,刷新內存數據或更新數據庫數據為內存數據。
還是以剛才的為例,可以在catch體內新增以下兩個刷新,最後再提交保存。
//強制用內存數據刷新數據庫,保持一致 myTestDB.Refresh(RefreshMode.ClientWins, data); //數據庫數據刷新內存數據,保持一致 myTestDB.Refresh(RefreshMode.StoreWins, data);
2 接下來簡要介紹LinQ to DataSet
首先來看一下一個結構:
實現DataSet的訪問需要實現以下兩點:
3、關於EntityDataSource控件與sqlDataSourcek控件用法沒有差別,也提供了一種可視化數據庫連接模型。不需要在後端page_load方法中進行LinQ 表達式和數據綁定,前面的功能可以通過以下幾個控件來實現。
生成頁面腳本:
<p>linQ初見篇:學以致用</p> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" DataSourceID="EntityDataSource1"> <Columns> <asp:BoundField DataField="CustomerID" HeaderText="客戶ID"/> <asp:BoundField DataField="ContactName" HeaderText="客戶姓名"/> <asp:BoundField DataField="City" HeaderText="城市"/> <asp:BoundField DataField="Country" HeaderText="國家"/> </Columns> </asp:GridView> <asp:EntityDataSource ID="EntityDataSource1" runat="server" ConnectionString="name=NorthwindEntities" DefaultContainerName="NorthwindEntities" EnableFlattening="False" EntitySetName="Customers" Select="it.[CustomerID], it.[ContactName], it.[City], it.[Country]"> </asp:EntityDataSource>
頁面效果:
<asp:QueryExtender ID="QueryExtender1" runat="server" TargetControlID="EntityDataSource1"> <asp:SearchExpression></asp:SearchExpression> <asp:RangeExpression></asp:RangeExpression> <asp:PropertyExpression></asp:PropertyExpression> <asp:OrderByExpression></asp:OrderByExpression> </asp:QueryExtender>