前面一篇文章<Git.Framework 框架隨手記--ORM新增操作>主要講解了如何使用Git.Framework往資料庫中新增資料。其操作過程相對簡單,本章主要記錄如何編輯資料和修改資料。
一. 編輯資料
在Git.Framework中主要提供瞭如下編輯方法
int Update(List<T> list); int Update(T entity); int Update(List<T> list, bool isOpenTrans); int Update(T entity, bool isOpenTrans);
以上方法可以分為兩組,區別在於兩個輸入引數的方法是可以啟用事務操作的,在前面的文章中已經提到過。預設是不啟用事務操作的。
public int Update(AdminEntity entity) { entity.Include(a => new { a.Phone, a.Email, a.Mobile, a.RealName, a.RoleNum, a.DepartNum, a.UserName, a.PassWord, a.UpdateTime }); entity.Where(a => a.UserCode == entity.UserCode); int line = this.Admin.Update(entity); return line; }
結合昨天使用的實體對映類,資料訪問介面,以及資料操作類,我們隊Admin表進行資料修改操作。
entity.Include(a => new { a.Phone, a.Email, a.Mobile, a.RealName, a.RoleNum, a.DepartNum, a.UserName, a.PassWord, a.UpdateTime });
這段程式碼應該很熟悉,上一篇文章已經介紹到了這個用法,用於包含操作哪些欄位,其中至少包含一個欄位。但是這裡要注意的是,如果Include中包含一個主鍵或者自動標識列是不會去真正包含的,其預設會將其他過濾掉,在實際的資料庫操作過程中我們也不會去修改主鍵值。
要想執行語句就要呼叫Update() 方法,該方法會向資料庫傳送命令操作。上一篇已經瞭解到資料庫操作實際上最終是生成SQL語句執行的。上面一段程式碼生成的SQL語句如下:
UPDATE [dbo].[Admin] SET [Phone]=@Phone,[Email]=@Email,[Mobile]=@Mobile,[RealName]=@RealName,[RoleNum]=@RoleNum,[DepartNum]=@DepartNum,[UserName]=@UserName,[PassWord]=@PassWord,[UpdateTime]=@UpdateTime WHERE Admin.[UserCode]=@0_Admin_UserCode
如果看到這種程式碼相信大家都比較熟悉了,一個帶條件的SQL語句,其中都是使用佔位符引數。在前面幾篇也講到了,這個框架的最底層其實還是ADO.NET,只是在表面封裝了一層看不到而已,而且在ADO.NET底層封裝還提供了相應的訪問類,後面詳述。
二. 編輯多行資料
在過載Update()方法的時候,我們看到有個引數List<T>,這個方法可以用於同時修改多行資料。
List<UA_USERS> list = new List<UA_USERS>(); UA_USERS user = new UA_USERS(); user.PASSWORD = "777777777"; user.Include(a => new { a.PASSWORD }); user.USER_ID = "AA0"; user.Where(a => a.USER_ID == user.USER_ID); list.Add(user); user = new UA_USERS(); user.PASSWORD = "55555555555"; user.USERNAME = "艾弗森"; user.Include(a => new { a.PASSWORD,a.USERNAME }); user.USER_ID = "AA1"; user.Where(a => a.USER_ID == user.USER_ID); list.Add(user); int line = provider.Update(list,true);
我們再集合中新增了三個實體物件,每個實體物件都有其相應的修改欄位以及條件,在呼叫Update 方法的時候會生成3行SQL語句,然後同時傳送命令執行。這裡三條語句的執行不是迴圈開啟3個連線,而是使用一個連線同時傳送三行SQL,相當於批處理模式。
三. 刪除方法簡介
(1) int Delete(IEnumerable<int> ids); (2) int Delete(int id); (3) int Delete(object value); (4) int Delete(T entity); (5) int Delete(IEnumerable<int> ids, bool isOpenTrans); (6) int Delete(int id, bool isOpenTrans); (7) int Delete(object value, bool isOpenTrans); (8) int Delete(T entity, bool isOpenTrans); (9) int DeleteBatch(IEnumerable<T> list, bool isOpenTrans);
在刪除資料上提供了九個過載方法,但是在這九個方法中並不是每個方法都用的那麼多。其中這九個方法可以分為三組: (1) 不用事務處理 (2) 使用事務處理 (3) 批量刪除
但是要注意的是這裡的批量刪除不是指刪除多行資料,而是和上面的Update()方法一樣,同時執行多個SQL語句.
(1) int Delete(IEnumerable<int> ids); 根據主鍵自動標識列批量刪除資料
(2) int Delete(int id); 根據逐漸標識列刪除資料
(3) int Delete(object value);根據主鍵值刪除資料
(4) int Delete(T entity); 根據自定義條件刪除資料,用的最多,比較靈活
(9) int DeleteBatch(IEnumerable<T> list, bool isOpenTrans);批量刪除資料,用的也比較多,自定義條件刪除
InStorDetailEntity detail = new InStorDetailEntity(); detail.Where(a => a.OrderNum == entity.OrderNum); this.InStorDetail.Delete(detail);
上面這段程式碼用於刪除InStorDetail表中的資料,而且附帶了條件,使用Where應該都明白和SQL中的Where是一樣的作用
detail.Where(a => a.OrderNum == entity.OrderNum);
只是這裡的Where是一個方法,並且使用到了Lambda表示式,我們可以簡單的翻譯為 欄位OrderNum= 值; 這個在學習過Linq to SQL或者Entity Framework的應該都可以明白。如果最終要執行還是要呼叫Delete 方法的。
DELETE FROM [dbo].[InStorDetail] WHERE InStorDetail.[OrderNum]=@0_InStorDetail_OrderNum
上面的程式碼生成如上SQL語句,如果.NET程式碼不能夠理解其意思,對比SQL就應該明白了