使用Subsonic的SimpleRepository进行细粒度CRUD

时间:2012-09-12 11:05:39

标签: c# .net subsonic simplerepository

让我说我的C#应用​​中有一个 TestClass ,其属性为 A ,属性为 B 。 我用我的代码更改 B 的值,我将属性 A 保持不变。 我通过SimpleRepository的Update方法在数据库中更新TestClass。

我认为它还更新了数据库中的属性 A 值。

很容易测试:我在我的应用程序之外的数据库中更改了值 A ('手动'),然后我从我的应用程序进行更新。根据TestClass在我的应用中的状态,属性 A 的值会更改回其值。

所以,我的问题是:是否可以仅对某些属性进行更新,而不是通过SimpleRepository对整个类进行更新?是否有一些'IgnoreFields'的可能性?

2 个答案:

答案 0 :(得分:1)

您需要optimistic concurrency语句UPDATE,而不是排除某些字段。简而言之,这意味着在更新表时,WHERE语句附加到UPDATE语句,以确保行中字段的值实际上是最后{{1}时的值。跑了。

因此,我们假设在您的示例中我选择了一些数据,SELECTA的值分别为B1。现在让我们假设我想更新2(以下语句只是一个例子):

B

但是,不要运行那个语句(因为那里没有并发),让我们运行这个:

UPDATE TestClass SET B = '3' WHERE Id = 1;

该声明现在确保任何人都没有改变记录。

然而,目前看来,Subsonic的SimpleRepository似乎不支持任何类型的并发,因此这将是一个重大的垮台。如果您正在寻找一个非常直接的存储库,您可以在其中使用POCO,我会推荐Dapper。实际上,Stackoverflow使用Dapper。它非常快非常,并且很容易让你在更新语句中建立并发性,因为你发送参数化的SQL语句很简单。

  1. 这篇Stackoverflow article是关于如何将Dapper用于所有CRUD操作的整篇文章。
  2. Stackoverflow article显示了如何使用Dapper执行插入和更新。
  3. 注意:使用Dapper,您实际上可以执行您想要的操作,因为您发送了基本的SQL语句,但我不建议不使用并发。

答案 1 :(得分:1)

对于这种情况,不要在DataObject上调用update方法,基本上表明对象已更改并需要在DB中更新。 所以亚音速会生成像

这样的查询
UPDATE TestClass SET A ='', B='', ModifiedOn = 'DateHere' WHERE PrimaryKey = ID

仅更改属性B,您需要手动构建UPDATE查询。 看看Subsonic.Update班 理想情况下,如果您这样做,则不应手动形成数据对象的新实例 从Subsonic.Select查询中恢复的对象复制值。
因此,当您更新甚至只有一个属性的值时,所有其他属性将从DB中保存自己的值,而不是默认值,具体取决于属性的类型。