在LINQ To SQL中覆盖DbContext方法

时间:2009-06-15 09:41:34

标签: linq-to-sql datacontext

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

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

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

由于

3 个答案:

答案 0 :(得分:0)

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

  • 您可以将删除映射到只在数据库中设置标志的存储过程
  • 您可以在调用SubmitChanges之前覆盖GetChangetSet并修正所有更改(通过base.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);
    }
}

答案 1 :(得分:0)

如果您想避免数据库中的重复用户名,为什么不在此字段上添加唯一索引?

答案 2 :(得分:0)

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

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