【问题标题】:Overwrite DataContext methods in LINQToSQL覆盖 LINQToSQL 中的 DataContext 方法
【发布时间】:2009-06-15 09:41:34
【问题描述】:

我是 LINQToSQL 的新手。有没有办法为特定实体覆盖 DataContext 类的“InsertOnSubmit”或“DeleteOnSubmit”方法?

例如,我有一个名为“客户”的数据库表,它有一个布尔字段“IsDeleted”,如果用户从 UI 中删除客户记录,则该字段为真。如果我调用 _myDataContext.Customers.DeleteOnSubmit(..),默认情况下它会从表中物理删除我不想要的记录。相反,我希望通过将“IsDeleted”字段设置为 true 来从逻辑上删除它。

执行此操作的一种方法是获取对象并在设置属性值后调用 Update 方法(而不是 Delete)。这也可以,但只是出于好奇,我想知道标准 DataContext 方法(InsertOnSubmit、DeleteOnSubmit 等)是否可重写?如果有,怎么做?

谢谢

【问题讨论】:

  • 我会更新你的评论(顺便说一句,你看到编辑了吗?)

标签: linq-to-sql datacontext


【解决方案1】:

据我所知,不,他们不是。如果您不想删除它.​​..不要调用删除!但是,还有一些其他选择:

  • 您可以将删除映射到只在数据库中设置标志的存储过程
  • 您可以在调用base.SubmitChanges 之前覆盖SubmitChanges 并修复任何更改(通过GetChangetSet) - 但是,我怀疑这是否是个好主意;例如,它可能需要重新插入该项目。

代码:

partial class MyDataContext {
    public override void SubmitChanges(ConflictMode failureMode) {
        var delta = GetChangeSet();
        foreach(var record in delta.Deletes.OfType<Customer>()) {
            Customers.InsertOnSubmit(record);
            record.IsDeleted = true;
        }
        base.SubmitChanges(failureMode);
    }
}

显然,如果需要更灵活,您可能希望使用GetTable()(而不是僵化的Customers 属性)。


更新您的评论;老实说,我不认为你可以做到那时;关于“10个地方”的事情...... IMO无论如何你都应该将数据上下文隐藏在存储库接口后面,所以所有10个地方都会调用像CreateUser这样处理数据上下文和必要逻辑的方法(也许用一个单独的业务逻辑类来处理一些规则)。此外,由于并发问题,通常应该在数据库级别(通过约束)处理唯一性。

但是在尝试保存它们之前做你想做的事:

partial class MyDataContext {
    public override void SubmitChanges(ConflictMode failureMode) {
        var delta = GetChangeSet();
        foreach(var record in delta.Inserts.OfType<User>()) {
            if(Users.Any(x=>x.Name == record.Name) {...throw an exception...}
        }
        base.SubmitChanges(failureMode);
    }
}

【讨论】:

  • 好的,这是实际的用例。请让我知道如何最好地实现这一点。我有一个表名 users ,我想确保用户尝试添加的用户名不存在。在调用 _DataContext.Users.InsertOnSubmit(objUser) 之前,我可以很容易地执行一个查询来检查这个,但是如果这个操作是从我的应用程序中的 10 个位置执行的呢?我必须在所有 10 个地方添加该检查。相反,如果我覆盖 DataContext.Users 的 InsertOnSubmit 方法并在调用 base.InsertOnSubmit 之前执行此检查,我只需在 1 个地方进行。
  • 一定有办法做到这一点。这是一种非常常见的情况。
  • 我相信这就是我所缺少的;代理。我试图从中间避免那个额外的层,以获得 LINQToSQL 对象可绑定的好处,但看起来除了将 LinqToSql 隐藏在代理后面以便可以添加自定义逻辑之外没有其他选择。
  • 顺便说一句,马克,我试图评价你的回复,但我在 StackOverFlow 上也太新了,所以还没有这个声誉分数:) 无论如何谢谢。
  • 没问题 - 无论如何它不会有任何区别(我已经达到了今天的代表上限 - 只有绿色刻度数,我明白了 ;-p)
【解决方案2】:

如果您想避免数据库中出现重复的用户名,为什么不在这个字段上放置一个唯一索引呢?

【讨论】:

  • 我可以并且实际上已经有了,但我上面提到的场景只是关于如何处理任何自定义逻辑的问题的一个示例。
【解决方案3】:

我还没有测试它,但我认为可以帮助你

http://www.devart.com/linqconnect/docs/ExecuteDynamicMethods.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2010-11-10
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 2011-09-15
    相关资源
    最近更新 更多