Linq to sql 增、删、查、改、解决更新过程冲突的方法
1.以Northwind数据库为例,以下是一个插入并查询显示的过程!
(Customer是其中的一张表,这里实例化一个,并存入数据库!)
NorthwindDataContext context = new NorthwindDataContext(); Customer c = new Customer { CustomerID = "Test2", CompanyName = "Test Company2" }; context.Customer.InsertOnSubmit(c); context.SubmitChanges();
Customer c1 = context.Customers.Single(ct => ct.CustomerID == "Test2"); //查询语句 Console.WriteLine(c1.CustomerID + " " + c1.CompanyName);
2.更新操作
NorthwindDataContext ctx = new NorthwindDataContext(); Customer alfki = ctx.Customers.Single(c => c.CustomerID == "ALFKI"); Console.WriteLine("Before update, the company name of Alfki is: " + alfki.CompanyName); alfki.CompanyName = "New Company Name"; ctx.SubmitChanges(); Customer newAlfki = ctx.Customers.Single(c => c.CustomerID == "ALFKI"); Console.WriteLine("After update, the company name of Alfki is: " + alfki.CompanyName);
3.删除操作
//删除 NorthwindDataContext context= new NorthwindDataContext(); context.Log = Console.Out; IQueryable<Customer> a = context.Customer.Where(o => o.CustomerID.Equals("ALFKI"));
context.Customer.DeleteAllOnSubmit(a);
context.SubmitChanges();
3.解决更新过程冲突的方法
数据库数据更新通常会遇到同步冲突的问题,比如获得数据以后,对数据进行一系列的操作,然后把新的数据更新回数据库。如果在数据进行操作的同时,有其它程序或者管理员改动了该数据的值,这样就会发生冲突。到底数据是应该保留现有的值呢还是把改动的值强行更新到数据库呢?Linq to SQL提供了很多方法来解决这种冲突问题。
还是一段简单的更新代码:
NorthwindDataContext ctx = new NorthwindDataContext(); Customer alfki = ctx.Customers.Single(c => c.CustomerID == "ALFKI"); alfki.CompanyName = "New Company Name"; ctx.SubmitChanges();
在SubmitChanges()加上断点然后运行,接着在数据库管理器中修改这条记录的CompanyName,最后回到vs界面,继续往下运行,这时会抛出ChangeConflictException,提示该行记录已经被删除或者被修改
在Linq to SQL中,解决冲突有几种方法:
- 在映射字段的Column Attribute中添加UpdateCheck属性
[Column(Storage="_CompanyName", DbType="NVarChar(40) NOT NULL", CanBeNull=false, UpdateCheck=UpdateCheck.Never)] public string CompanyName {
UpdateCheck的意思是在更新的时候是否检查冲突,分为三种,根据自己的需求进行选择:
- Always 始终检查
- Never 从不检查
- WhenChanged 当数据有改动的时候检查
2. 使用ObjectChangeConflict的Resolve方法,比如:
try { ctx.SubmitChanges(); } catch (ChangeConflictException) { foreach (ObjectChangeConflict confict in ctx.ChangeConflicts) { confict.Resolve(RefreshMode.KeepCurrentValues); } } finally { ctx.SubmitChanges(); }
这里RefreshMode就是表示解决冲突的方法,也有三种:
- KeepChanges 把改变过的属性值更新到数据库,没有改变过的属性值就用数据库的当前值
- KeepCurrentValues 把当前所有值更新到数据库
- OverwriteCurrentValues 使用数据库的当前值,不做强行更新