我来自asp.net世界,我们使用objectdatasource,连接数据访问层,并将其ConflictDetection属性设置为“CompareAllValues”。 ObjectDataSource上有一个OldValuesParameterFormatString,用于标识旧值参数。
执行更新的sql过程将需要新的参数和旧参数,这就是它......实现起来非常简单; ODS为您处理旧值。
我已经转移到Linq到SQL和WinForms。我已经创建了一个WCF服务,它是我们的业务层,我有一个存储过程,它将更新一些表。在数据上下文设计器中,我看到我的类列上有一个Update Check属性。我不是直接从类中更新表,而是调用存储过程来进行更新。有没有办法保留原始值,可能来自数据上下文,类似于objectdatasource的方式?
答案 0 :(得分:3)
您是直接使用存储过程(通过SqlCommand
)还是通过LINQ to SQL? LINQ to SQL支持使用存储过程进行所有数据库访问。您可能希望查看Updating our Database using Stored Procedures关于LINQ to SQL的博客文章系列的第7部分Scott Guthrie。您可以通过DBML设计器或使用DataContext
部分类的代码设置sprocs的使用。我们的想法是将新值和原始值(例如Name
和OriginalName
)发送到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,我觉得我有义务指出这篇文章供您参考:
虽然本文将ASP.NET作为主要表示层,但考虑到您的背景,它实际上可能使文章更容易理解。
我亲自处理了与您现在正在进行的相同类型的开发(客户端的winforms,业务逻辑层的WCF,数据访问的LINQ2SQL),但是作为WCF&amp;的完全初学者。在当时的LINQ2SQL中,我基本上不得不降低保留原值。这篇文章最接近您的需求,但说实话,我没有看到任何与使用存储过程有关的东西。
答案 2 :(得分:-1)
LinqToSql有许多并发方法。其中一个重载的Attach()
方法(用于更新)需要2个参数:原始实体和新实体。 LinqToSql将执行ObjectDataSource
过去所做的事情,并将旧值与new和throw并发异常进行比较(它甚至使处理并发异常变得更加容易。+ 10 ..但这不是你的问题。)
Use this reference,特别是底部的部分称为有完整实体。它很有意义,并展示了如何使用不同的并发方法以及如何处理异常。
很开心。