假设我的TestClass在我的C#应用程序中,带有属性A和property B。通过代码更改B的值,使属性A保持不变。我使用SimpleRepository的更新方法更新数据库中的TestClass。
正如我所看到的,它还更新数据库中的属性A值。
测试很容易:我在应用程序之外的数据库中更改值A (“手动”),然后从我的应用程序中进行更新。属性的值--根据我的应用程序中的TestClass状态更改回它的值。
所以,我的问题是:是否可以只对某些属性进行更新,而不是通过SimpleRepository对整个类进行更新?有一些“IgnoreFields”的可能性吗?
发布于 2012-09-12 11:19:04
您需要的是optimistic concurrency对您的UPDATE语句,而不是排除某些字段。简而言之,这意味着在更新表时,会在UPDATE语句中追加一个UPDATE子句,以确保行中字段的值实际上与上一次运行SELECT时的值相同。
因此,让我们假设在您的示例中,我选择了一些数据,A和B的值分别是1和2。现在让我们假设我想更新B (下面的语句只是一个例子):
UPDATE TestClass SET B = '3' WHERE Id = 1;但是,与其运行该语句(因为那里没有并发性),不如运行以下语句:
UPDATE TestClass SET B = '3' WHERE Id = 1 AND A = '1' AND B = '2';这份声明现在确保了记录没有被任何人改变。
然而,目前看来,Subsonic的SimpleRepository不支持任何类型的并发,因此这将是一次重大的失败。如果您正在寻找一个非常直接的存储库,您可以在其中使用POCO,我推荐Dapper。实际上,Stackoverflow使用了Dapper。它是非常快的,可以轻松地将并发性构建到update语句中,因为您发送了参数化的SQL语句,非常简单。
注意:使用Dapper的实际上也可以做您想做的事情,因为您发送了基本的SQL语句,但我只是不建议不要使用并发性。
https://stackoverflow.com/questions/12386761
复制相似问题