【问题标题】:Fine Grained CRUD with Subsonic's SimpleRepository细粒度的 CRUD 与 Subsonic 的 SimpleRepository
【发布时间】:2012-09-05 09:21:29
【问题描述】:

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

正如我所见,它还会更新数据库中的属性 A 值。

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

所以,我的问题是:是否可以只更新某些属性,而不是 SimpleRepository 的整个类?是否有一些“IgnoreFields”的可能性?

【问题讨论】:

    标签: c# .net subsonic simplerepository


    【解决方案1】:

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

    因此,假设在您的示例中我选择了一些数据,AB 的值分别为 12。现在假设我想更新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。它非常速度很快,并且很容易让您在更新语句中构建并发,因为您发送参数化的 SQL 语句,很简单。

    1. 这篇 Stackoverflow article 是一篇关于如何将 Dapper 用于所有 CRUD 操作的整体文章。
    2. Stackoverflow article 展示了如何使用 Dapper 执行插入和更新。

    注意:使用 Dapper 您实际上也可以做您想做的事情,因为您发送基本的 SQL 语句,但我不建议您不使用并发。

    【讨论】:

      【解决方案2】:

      这种情况不要在DataObject上调用update方法,你基本上是在表明对象已经改变,需要在DB中更新。 所以亚音速会生成一个类似的查询

      UPDATE TestClass SET A ='', B='', ModifiedOn = 'DateHere' WHERE PrimaryKey = ID
      

      要仅更改属性 B,您需要手动构造 UPDATE 查询。 看看Subsonic.Update 类。
      理想情况下,您不应该手动形成数据对象的新实例,如果这样做,请确保 这些值是从Subsonic.Select 查询返回的对象复制而来的。
      因此,即使您只更新一个属性的值,所有其他属性都将保留其来自 DB 的值,而不是默认值,具体取决于属性的类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-23
        • 1970-01-01
        • 2014-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多