据我所知,不,他们不是。如果您不想删除它...不要调用删除!但是,还有一些其他选择:
- 您可以将删除映射到仅在数据库中设置标志的存储过程
- 您可以在调用之前覆盖
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);
}
}