我是LINQToSQL的新手。有没有办法覆盖特定实体的DataContext类的“InsertOnSubmit”或“DeleteOnSubmit”方法?
例如,我有一个名为Customers的数据库表,它有一个布尔字段“IsDeleted”,如果用户从UI中删除客户记录,则该表保持为true。如果我将调用_myDataContext.Customers.DeleteOnSubmit(..),默认情况下它会从表中删除我不想要的记录。相反,我希望通过将“IsDeleted”字段设置为true来逻辑删除它。
执行此操作的一种方法是在设置属性值后获取对象并调用Update方法(而不是Delete)。这也可以,但出于好奇,我想知道标准的DataContext方法(InsertOnSubmit,DeleteOnSubmit等)是否可以覆盖?如果是这样,怎么样?
由于
答案 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