与Linq到Sql存储过程的并发

时间:2009-05-07 18:33:08

标签: sql linq wcf linq-to-sql concurrency

我来自asp.net世界,我们使用objectdatasource,连接数据访问层,并将其ConflictDetection属性设置为“CompareAllValues”。 ObjectDataSource上有一个OldValuesParameterFormatString,用于标识旧值参数。

执行更新的sql过程将需要新的参数和旧参数,这就是它......实现起来非常简单; ODS为您处理旧值。

我已经转移到Linq到SQL和WinForms。我已经创建了一个WCF服务,它是我们的业务层,我有一个存储过程,它将更新一些表。在数据上下文设计器中,我看到我的类列上有一个Update Check属性。我不是直接从类中更新表,而是调用存储过程来进行更新。有没有办法保留原始值,可能来自数据上下文,类似于objectdatasource的方式?

3 个答案:

答案 0 :(得分:3)

您是直接使用存储过程(通过SqlCommand)还是通过LINQ to SQL? LINQ to SQL支持使用存储过程进行所有数据库访问。您可能希望查看Updating our Database using Stored Procedures关于LINQ to SQL的博客文章系列的第7部分Scott Guthrie。您可以通过DBML设计器或使用DataContext部分类的代码设置sprocs的使用。我们的想法是将新值和原始值(例如NameOriginalName)发送到sproc,以便进行并发检查。

如果您直接使用sproc而不是通过LINQ to SQL,并且您想要的只是获取对象的原始值,您可以使用Table<T>.GetOriginalEntityState()来获取它们:

Order modifiedOrder = db.Orders.First();  // using first Order as example
modifiedOrder.Name = "new name";          // modifying the Order
Order originalOrder = db.Orders.GetOriginalEntityState(modifiedOrder);

答案 1 :(得分:1)

不是您可能正在寻找的答案,但由于您提到使用WCF作为业务层以及LINQ2SQL,我觉得我有义务指出这篇文章供您参考:

http://www.sidarok.com/web/blog/content/2008/05/26/linq-to-sql-with-wcf-in-a-multi-tiered-action-part-1.html

虽然本文将ASP.NET作为主要表示层,但考虑到您的背景,它实际上可能使文章更容易理解。

我亲自处理了与您现在正在进行的相同类型的开发(客户端的winforms,业务逻辑层的WCF,数据访问的LINQ2SQL),但是作为WCF&amp;的完全初学者。在当时的LINQ2SQL中,我基本上不得不降低保留原值。这篇文章最接近您的需求,但说实话,我没有看到任何与使用存储过程有关的东西。

答案 2 :(得分:-1)

  • 抛弃sprocs并为表创建一个新的DBML文件。
  • 拖动你的桌子和bam! LinqToSql将为您创建实体类,并提供更新(创建..等)的方法。

LinqToSql有许多并发方法。其中一个重载的Attach()方法(用于更新)需要2个参数:原始实体和新实体。 LinqToSql将执行ObjectDataSource过去所做的事情,并将旧值与new和throw并发异常进行比较(它甚至使处理并发异常变得更加容易。+ 10 ..但这不是你的问题。)

Use this reference,特别是底部的部分称为有完整实体。它很有意义,并展示了如何使用不同的并发方法以及如何处理异常。

很开心。