商讯信箱
用户名: @
密  码:   注册|忘记密码
登录
个人用户经销商
您的位置:首页 > 技术频道 > 正文

Linq To Sql进阶系列(三)CUD和Log

作者:Tom Song  2008-01-15
【IT168技术文档】
  这表明Linq To Sql自动更新了该对象,把数据库自增字段的值取出,赋于该对象。从这里,也可以看出,Linq To Sql在插入数据时,自动调用了事务,以防止返回的不是其插入的。

  2.2
  对与One : Many的关系型的,在提交One端新数据时,Linq To Sql会自动将Many端的数据一起提交。注意,是提交One端哦。比如
var newCategory = new Category { CategoryName = "Widgets", Description = "Widgets are the customer-facing analogues " + "to sprockets and cogs." }; var newProduct = new Product { ProductName = "Blue Widget", UnitPrice = 34.56M, Category = newCategory }; db2.Categories.Add(newCategory); db2.SubmitChanges();
  2.3
  而对于Many : Many的关系(关于M:M请参考上篇),就需要你从One 一个个开始,一直到Many端,自己去提交了。如:
var newEmployee = new Employee { FirstName = "Kira", LastName = "Smith" }; var newTerritory = new Territory { TerritoryID = "12345", TerritoryDescription = "Anytown", Region = db.Regions.First() }; var newEmployeeTerritory = new EmployeeTerritory { Employee = newEmployee, Territory = newTerritory }; db.Employees.Add(newEmployee); db.Territories.Add(newTerritory); db.EmployeeTerritories.Add(newEmployeeTerritory); db.SubmitChanges();
  3, Update
  这个更简单,用Linq To Sql获取对象后,进行一系列处理后,做更新,直接调用DataContext中的SubmitChanges方法。我们来讲一个在不同 DataContext之间,更新的问题。涉及到不同的DataContext,就要使用Attach方法了。在使用Attach方法时,请在其实体类的主键的Attribute上,添加IsVersion=true,比如:[Column(Storage="_PageID"...., IsVersion=true)] 。这样,另外一个DataContext才知道,该对象是否需要更新。大家需要注意的是,在更新问题上,对谁更新,就直接Attach谁。比如,有A和B 两个实体,他们之间是有关系的。对A更新直接对A操作,而不是对B操作。见例子:
nwind.Order o = null; using (nwind.Northwind db = new nwind.Northwind(constr)) { o = db.Orders.First(); o.Customer.City = "new city"; //db.SubmitChanges(); //此处提交是没有问题的。 } using (nwind.Northwind db = new nwind.Northwind(constr)) { db.Log = Console.Out; db.Orders.Attach(o, true); // 对Customer进行更新,却Attach了Order,其结果,只是在数据库中insert一个新的Customer //db.Customers.Attach(o.Customer, true); //这个是对的。 db.SubmitChanges();
  4, Delete
  Delete 使用Remove方法。唯一可以讲的是,在One:Many的关系中,需要先Remove其Many端,其次才是One端。道理很简单,One端是主键呀,只要Many端还有一个和该键相关的记录,服务器是不会允许你删除该主键的。比如:
var order = (from o in db.Orders where o.CustomerID == "WARTH" && o.EmployeeID == 3 select o).First(); foreach (OrderDetail od in orderDetails) { db.OrderDetails.Remove(od); } db.Orders.Remove(order); db.SubmitChanges();
  5, Log
  Log吗,顾名思义,就是日志。其记录了Linq To Sql的所有操作。我们可以将起写入文件,以备检查对数据库的操作。比如:
StreamWriter sw = new StreamWriter("log.txt",true); db.Log = sw; var q = db.Customers.Select(c => c).ToList(); sw.Close();
1 2
【内容导航】
第1页: 概述 第2页: 第2页
©版权所有。未经许可,不得转载。
[责任编辑:nancy]
[an error occurred while processing this directive]