【问题标题】:Linq To Sql - Update a value when another value changesLinq To Sql - 当另一个值更改时更新一个值
【发布时间】:2010-10-17 09:07:56
【问题描述】:

使用 Linq To Sql - 当不同表中的值发生更改时,更新数据库中一个表的值的最佳方法是什么?

例如,在 TableA 中,有一个名为 DateModified 的列。 TableA 与 TableB 有关联。现在,我想将 DateModified 字段的值设置为每次 tableA 中的记录更改以及每次在 TableB 中创建/更新/删除子记录时的当前日期。

如何做到这一点?

【问题讨论】:

    标签: c# .net asp.net linq linq-to-sql


    【解决方案1】:

    如果更改只是在一条记录中,您可以使用 On*Changed 部分方法,或者您可以在数据上下文中覆盖 SubmitChanges,调用 GetChangeSet,并在更改之前应用更改更新。后一种(数据上下文)方法对于捕获广泛的变化很有用,而 On*Changed 方法对于特定于单个属性的逻辑很有用。

    但是,在本例中(非同质更新),我认为数据库触发器可能更合适。

    【讨论】:

    • 如果每次更改都会更新它,我宁愿不为每个属性实现 On*Changed 方法,而是注册一个 PropertyChanged 处理程序,因为如果成功,每个设置器都会为该列触发 SendPropertyChanged .
    • 顺便说一句——我同意触发器是处理这个问题的更好方法。
    【解决方案2】:

    要么通过允许您在 TableA 上执行更新的 StoredProcedure 在 TableB 上执行插入/更新/删除操作,要么在更新 TableA 的 TableB 上使用插入/更新/删除触发器

    我不会尝试在 LINQ 中完成此操作,因为这将涉及覆盖各种 IDE 生成的代码结构(维护噩梦)或对数据库的额外调用以获取相关的 TableA 项目。

    【讨论】:

      【解决方案3】:

      您可以在 OnCreated 中的子实体上注册一个 PropertyChanged 事件处理程序(在部分类中实现)并让该处理程序更新父属性。如果您不关心已经加载的类会发生变化,那么使用@Marc 建议的数据库触发器也是一种选择。

      编辑:如果您还需要捕获删除,您可以实现数据上下文的删除部分方法,以调用相同的处理程序方法来更新被删除实体的父级。

      【讨论】:

        猜你喜欢
        • 2019-07-08
        • 2021-03-19
        • 1970-01-01
        • 1970-01-01
        • 2014-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多