2009-06-15 57 views
1

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

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

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

谢谢

+0

我会重新您的评论更新(你看到的编辑,顺便说一句?) – 2009-06-15 10:03:04

回答

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属性)。


更新re your comment;我真的不认为你可以做到这一点在这一点;关于“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); 
    } 
} 
+0

好了,这是实际使用情况。请让我知道如何实现最佳效果。我有一个表名用户,我想确保用户名用户尝试添加不存在。在调用_DataContext.Users.InsertOnSubmit(objUser)之前,我可以非常轻松地执行一个查询来检查这个问题,但是如果在我的应用程序中从10个位置执行该操作会怎么样呢?我必须在所有10个地方添加检查。相反,如果我重写DataContext.Users的InsertOnSubmit方法并在调用base.InsertOnSubmit之前执行此检查,我只需要在1个位置执行此操作。 – 2009-06-15 09:57:52

+0

必须有这样做的方式。这是一种非常常见的情况。 – 2009-06-15 09:59:07

0

如果你想避免在数据库中重复的用户名,为什么不把一个唯一索引这个领域?