Linq調(diào)用SubmitChanges方法
Linq SubmitChanges方法計(jì)算要插入、更新或刪除的已修改對(duì)象的集,并執(zhí)行相應(yīng)命令以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的更改。
無(wú)論對(duì)象做了多少項(xiàng)更改,都只是在更改內(nèi)存中的副本。并未對(duì)數(shù)據(jù)庫(kù)中的實(shí)際數(shù)據(jù)做任何更改。直到對(duì)DataContext顯式Linq SubmitChanges,所做的更改才會(huì)傳輸?shù)椒?wù)器。調(diào)用時(shí),DataContext會(huì)設(shè)法將我們所做的更改轉(zhuǎn)換為等效的SQL命令。我們也可以使用自己的自定義邏輯來(lái)重寫這些操作,但提交順序是由DataContext的一項(xiàng)稱作“更改處理器”的服務(wù)來(lái)協(xié)調(diào)的。事件的順序如下:
1. 當(dāng)Linq SubmitChanges方法時(shí),LINQ to SQL會(huì)檢查已知對(duì)象的集合以確定新實(shí)例是否已附加到它們。如果已附加,這些新實(shí)例將添加到被跟蹤對(duì)象的集合。
2. 所有具有掛起更改的對(duì)象將按照它們之間的依賴關(guān)系排序成一個(gè)對(duì)象序列。如果一個(gè)對(duì)象的更改依賴于其他對(duì)象,則這個(gè)對(duì)象將排在其依賴項(xiàng)之后。
3. 在即將傳輸任何實(shí)際更改時(shí),LINQ to SQL會(huì)啟動(dòng)一個(gè)事務(wù)來(lái)封裝由各條命令組成的系列。
4. 對(duì)對(duì)象的更改會(huì)逐個(gè)轉(zhuǎn)換為SQL命令,然后發(fā)送到服務(wù)器。
如果數(shù)據(jù)庫(kù)檢測(cè)到任何錯(cuò)誤,都會(huì)造成提交進(jìn)程停止并引發(fā)異常。將回滾對(duì)數(shù)據(jù)庫(kù)的所有更改,就像未進(jìn)行過(guò)提交一樣。DataContext 仍具有所有更改的完整記錄。
下面代碼說(shuō)明的是在數(shù)據(jù)庫(kù)中查詢CustomerID為ALFKI的顧客,然后修改其公司名稱,***次更新并Linq SubmitChanges方法,第二次更新了數(shù)據(jù)但并未Linq調(diào)用SubmitChanges方法。
- //查詢
- Customer cust = db.Customers.First(c => c.CustomerID == "ALFKI");
- //更新數(shù)據(jù)并調(diào)用SubmitChanges()方法
- cust.CompanyName = "YJingLee's Blog";
- db.SubmitChanges();
- //更新數(shù)據(jù)沒(méi)有調(diào)用SubmitChanges()方法
- cust.CompanyName = "http://lyj.cnblogs.com";
動(dòng)態(tài)查詢
使用動(dòng)態(tài)查詢,這個(gè)例子用CreateQuery()方法創(chuàng)建一個(gè)IQueryable
- var c1 = Expression.Parameter(typeof(Customer), "c");
- PropertyInfo City = typeof(Customer).GetProperty("City");
- var pred = Expression.Lambda<Func<Customer, bool>>(
- Expression.Equal(
- Expression.Property(c1, City),
- Expression.Constant("Seattle")
- }
- };
- IQueryable custs = db.Customers;
- Expression expr = Expression.Call(typeof(Queryable), "Where",
- new Type[] { custs.ElementType }, custs.Expression, pred);
- IQueryable<Customer> q = db.Customers.AsQueryable().
- Provider.CreateQuery<Customer>(expr);
Log屬性用于將SQL查詢或命令打印到TextReader。此方法對(duì)了解 LINQ to SQL 功能和調(diào)試特定的問(wèn)題可能很有用。
下面的示例使用Log屬性在SQL代碼執(zhí)行前在控制臺(tái)窗口中顯示此代碼。我們可以將此屬性與查詢、插入、更新和刪除命令一起使用。
- //關(guān)閉日志功能
- //db.Log = null;
- //使用日志功能:日志輸出到控制臺(tái)窗口
- db.Log = Console.Out;
- var q = from c in db.Customers
- where c.City == "London"
- select c;
- //日志輸出到文件
- StreamWriter sw = new StreamWriter(Server.MapPath("log.txt"), true);
- db.Log = sw;
- var q = from c in db.Customers
- where c.City == "London"
- select c;
- sw.Close();
【編輯推薦】