忘记我不可靠的解决方法(如果必须,请参阅编辑历史记录),我找到了一种更可靠的方法来完成这项工作!
首先,忘记为此使用部分方法(例如UpdateTable1
在问题中),除非您仅修改实例记录的数据,否则它效果不佳。所以我保留这些部分方法只是为了我需要更新实例中的相关字段。
这样做的SubmitChanges
方法是覆盖部分DataContext
类中的方法。这将允许在您允许处理默认值之前插入/更新/删除任何表记录SubmitChanges
(并因此锁定此功能)。
在覆盖内,您可以使用 访问当前DataContext
更改集this.GetChangeSet()
,从中可以循环所有更改并执行所需的任何其他表工作(例如添加日志记录)。
对于下面的示例,假设我有一个名为的标准数据库表,并且我Table1
有一个名为a (更改时间)和 a (即添加/编辑/删除)。Table1Log
Table1
Table1Log
DateTime
LogType
这是我最终代码的重要部分:
partial class MyDataContext
{
public override void SubmitChanges(System.Data.Linq.ConflictMode failureMode)
{
var set = this.GetChangeSet();//get a list of all pending changes
foreach (var item in set.Inserts)
{
AddLog(item, LogType.Add);
}
foreach (var item in set.Updates)
{
AddLog(item, LogType.Edit);
}
foreach (var item in set.Deletes)
{
AddLog(item, LogType.Delete);
}
base.SubmitChanges(failureMode);//allow the DataContext to perform it's default work (including your new log changes)
}
public void AddLog(object item, LogType logType)
{
//some painful type testing, so feel free to refactor this as you wish
if(item is Table1)
{
var log = (item as Table1).ToLog(logType);//ToLog() is an extension method (one for each type)
this.Table1_Logs.InsertOnSubmit(log);//add the log record ready to be submitted
}
else if(item is Table2)
{
//same again
}
//...repeat for each table class type
}
}
注意:可以在此处找到if/else 类型测试的替代方法。我实际上在我的代码中使用了它,它工作得非常好,我怀疑它是否有性能优势,但是当你需要切换 50 多种类型时,它确实有助于使事情更具可读性。