1

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

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

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

谢谢

4

3 回答 3

0

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

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

代码:

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);
    }
}
于 2009-06-15T09:48:26.543 回答
0

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

于 2009-06-15T11:47:19.473 回答
0

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

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

于 2014-01-06T13:13:06.110 回答