国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

LinQ學習(三)-LinQ to Entity后續

2019-11-17 03:07:22
字體:
來源:轉載
供稿:網友

LinQ學習(三)-LinQ to Entity后續

昨天由于時間有限,還剩余一些后續,為了保持自己每日總結寫博客的習慣,今天來完善昨天的內容,那關于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的訪問需要實現以下兩點:

  • DataSet沒有強類型數據,在LinQ 表達式中需要使用單一字段值時需要調用DataRow.Field<[string][int]>("ColName")擴展方法實現。
  • DataRow與DataTable僅僅只實現了弱類型的IEnumerable接口,還需要調用AsEnumerable()如:DataTable.AsEnumerable()強制類型轉換。

3、關于EntityDataSource控件與sqlDataSourcek控件用法沒有差別,也提供了一種可視化數據庫連接模型。不需要在后端page_load方法中進行LinQ 表達式和數據綁定,前面的功能可以通過以下幾個控件來實現。

  • EntityDataSource:連接數據源

生成頁面腳本:

<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>

頁面效果:

  • QueryExtender:實現查詢、過濾。
    <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>


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 尉氏县| 股票| 墨玉县| 平阳县| 关岭| 鄂托克前旗| 恭城| 江安县| 大足县| 池州市| 水城县| 天镇县| 巴中市| 阳泉市| 五大连池市| 宜州市| 偏关县| 宁安市| 五原县| 海盐县| 唐海县| 安康市| 安仁县| 新巴尔虎左旗| 聂荣县| 道孚县| 咸丰县| 建阳市| 黄骅市| 永登县| 慈溪市| 尼木县| 北安市| 惠东县| 称多县| 离岛区| 洞头县| 新河县| 桂阳县| 栖霞市| 兰西县|