织梦CMS - 轻松建站从此开始!

资讯网-www.2xp.cn

当前位置: 主页 > 设计开发 >

Linq

时间:2011-11-25 13:31来源:www.2xp.cn 作者:2xp资讯网 点击:
一旦实体工具被加载到内存中,插进新订单的事情就很是简朴,无非是建设Order类的实例并将其添加到客户工具的Orders荟萃中。Linq-to-SQL会跟踪数据上下文中的更改,并在挪用数据上下文

一旦实体工具被加载到内存中,插进新订单的事情就很是简朴,无非是建设Order类的实例并将其添加到客户工具的Orders荟萃中。Linq-to-SQL会跟踪数据上下文中的更改,并在挪用数据上下文工具的SubmitChanges时将那些更改传回数据库。下例显示了一个更改数据的历程:
    string id = "ALFKI";Customer c = dataContext.Customers.SingleOrDefault(c => c.CustomerID == id);if(c != null){
    //修改数据
    c.Address = "123 Flowers Streat);
    //提交更改到数据库中
    dataContext.SubmitChanges();}工具的添加与删除
    数据上下文工具会自动跟踪添加到上下文的工具,并跟踪已被更新、删除或添加的工具。挪用SubmitChanges要体会指示数据上下文类,针对底层的数据库,将挂起的更改转化为更新语句。
    添加新纪录示例:
    Customer customer = new Customer();
    customer.CustomerID = "KOEN2";customer.CompanyName = "…";…dataContext.Customers.InsertOnSubmit(customer);
    dataContext.SubmitChanges();
    删除示例:
    Customer koen2 = dataContext.Customers.SingleOrDefault(c => c.CustomerID == "KOEN2");
    if(koen2 != null){
    dataContext.Customers.DeleteOnSubmit(koen2);
    dataContext.SubmitChanges();}
    在乐成执行SubmitChanges后,已删除工具在数据上下文中会被标志为Deleted,而不会将其从内部缓存中现实删除。
    跨表更新
    Linq-to-SQL使我们能够在数据上下文中对表间关系举行建模,也支持跨表更新。我们要做的只是从响应的Table工具中将工具移除,其余的事情由SubmitChanges完成。
    //建设客户Customer mands = new Customer();
    //mands的属性赋值…dataContext.Customers.InsertOnSubmit(mands);
    //添加订单Order order = new Order();
    //为order的属性赋值…//将订单添加到mands的Orders属性中mands.Orders.Add(order);
    //提交更改到数据库中dataContext.SubmitChanges();
    删除上例中添加的客户与订单:
    //取出客户的订单var orders = from o in dataContext.Orders
    where o.CustomerID == "MANDS"
    select o;//删除订单foreach(var o in orders)
    dataContext.Orders.DeleteOnSubmit(o);
    //取出客户工具Customer mands = dataContext.Customers.SingleOrDefault(c => c.CustomerID == "MANDS");
    if(mands != null){
    //删除客户并提交更改到数据库中
    dataContext.Customers.DeleteOnSubmit(mands);
    dataContext.SubmitChanges();}
    注重,我们应该首先删除客户订单,然后再删除该客户。若是先删除客户,由于客户表与订单表存在表间约束,将引发异常。
    开放式并发
    以上例为例,我们在删除订单时若是使用SQL Profile工具跟踪SQL现实执行的语句,可发现它执行的是如下的语句:
    Delete From dbo.CustomersWhere CustomerID = 'MANDS'
    and CompanyName = 'Managed Design'
    and ContactName = 'Dino'
    and ContactTitle is NULL
    and Address = 'Via dei Tigli'
    and City = 'Milan'
    and Region is NULL
    and PostalCode is NULL
    and Country = 'Italy'
    and Phone is NULL
    and Fax is NULL

这种手艺称为"开放式并发",它要求在更新和删除纪录前,检测是否有其他事务对该纪录做了修改。"守旧式并发"在更新或删除时,为阻止冲突,会对纪录加锁。默认情形下,Linq-to-SQL使用的是开放式并发。
    我们可以将一个参数传给SubmitChanges,指示它忽略冲突异常并继续执行:
    dataContext.SubmitChanges(ConflictMode.ContinueOnConflict);
    默认值为ConflictMode.FailOnFirstConflict.若是选择继续更新,怎样获知哪些下令失败呢?
    为此,我们可以遍历数据上下文的ChangeConflicts荟萃:
    try{
    dataContext.SubmitChanges(ConflictMode.ContinueOnConflict);
    }catch(ChangeConflictException e){
    foreach(ObjectChangeConflict occ in dataContext.ChangeConflicts)
    {}}
    ObjectChangeConflict类中界说的属性使我们能相识到底发生了什么,在哪张表上发生的,以及涉及了哪个实体工具。
    更新使用的自界说
    为删除某个客户的所有订单,若是不使用LINQ,我们可能会这样做:
    Delete From orders Where customerid = 'MANDS'
    Linq-to-SQL提供了一种要领,可以更改实体工具更新使用的实现。由于Linq-to-SQL构建于分部类之上,我们只要添加一个分部要领就可以了。
    下面是Customer实体的数据上下文类,可以通太过部要领扩展列表:
    partial void InsertCustomer(Customer instance);
    partial void UpdateCustomer(Customer instance);
    partial void DeleteCustomer(Customer instance);
    这类要领的形式为InsertXxx、UpdateXxx、DeleteXxx,其中Xxx代表数据上下文中实体的名称。这样,在删除客户纪录时,我们可以这样做:
    partial void DeleteCustomer(Customer instance){
    this.ExecuteCommand("Delete From customers Where customerid={0}", instance.CustomerID);}
    使用此扩展要领后,在删除客户纪录时自动删除相关订单。
    我们还可以用更新使用的自界说特征,用存储历程取代T-SQL下令来执行数据库使用。
    使用事务
    通过SubmitChanges提交的所有更新都市在一个事务中举行。挪用该要领后,Linq-to-SQL会验证当前挪用是否处于其他事务的作用规模,确保用户提倡的事务没有显式地绑定到数据上下文。若是没有现有事务,Linq-to-SQL会启动一个当地事务,并使用该事务执行所有T-SQL下令。当所有下令都执行完毕后,Linq-to-SQL会提交该事务。
    我们可以在自己的代码中使用TranscationScope工具封装由SubmitChanges要领引发的任何数据库使用。如,通过外部的TranscationScope工具,我们可以将其他的非数据库资源引进到事务中,可以向MSMQ发送新闻,也可以是更新文件系统。若SubmitChanges检测到自身处于某个现有事务的作用域内,它不仅会阻止新事务的建设,而且还会阻止毗连的关闭。
    我们还可自行提倡一个事务,将多个SubmitChanges的下令与该事务关联。为此,我们可使用数据上下文工具的Transaction属性。提交或回滚完全取决于开发者。若是事务的毗连字符串与数据上下文所使用的不匹配,则会有异常抛出。
    使用存储历程
    我们可以在分部要领中使用ExecuteCommand要领执行存储历程。示例:
    partial void DeleteCustomer(Customer instance){
    this.ExecuteCommand("exec delete_customer {0}", instance.CustomerID);}
    此外,我们可以在VS2008的O/R设计器将存储历程添加到数据上下文中,就可将存储历程当成数据上下文的要领来挪用。
    假设我们已将名为CustOrderHist的存储历程添加到数据上下文中,挪用要领如下:
    var orders = dataContext.CustOrderHist(customerID);
    我们可使用var要害字对效果类型举行推断。若存储历程返回多个值或差异类型的值,数据上下文中该存储历程的封装器会返回IMultipleResults类型,在这种情形下,我们可使用GetResult<T>来会见给定的效果。其中T用于指定特定效果的类型。
    使用用户界说的函数
    与存储历程类似,用户在数据库中的自界说函数也可附加到数据上下文中,并在页面中以要领的形式挪用。

(责任编辑:admin)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片