Поскольку мы используем LINQ2SQL, эту задачу довольно легко выполнить, переопределяя метод SubmitChanges (). Наша главная цель - провести аудит в наших таблицах. Код хотел бы это:
/// <summary>
/// Sends changes that were made to retrieved objects to the underlying database,
/// and specifies the action to be taken if the submission fails.
/// NOTE: Handling this event to easily perform Audit tasks whenever a table gets updated.
/// </summary>
/// <param name="failureMode">The action to be taken if the submission fails.
/// Valid arguments are as follows:<see cref="F:System.Data.Linq.ConflictMode.FailOnFirstConflict"/>
/// <see cref="F:System.Data.Linq.ConflictMode.ContinueOnConflict"/></param>
public override void SubmitChanges(System.Data.Linq.ConflictMode failureMode)
{
//Updates
for (int changeCounter = 0; changeCounter < this.GetChangeSet().Updates.Count; changeCounter++)
{
object modifiedEntity = this.GetChangeSet().Updates[changeCounter];
SetAuditStamp(this, modifiedEntity, ChangeType.Update);
}
//Inserts
for (int changeCounter = 0; changeCounter < this.GetChangeSet().Inserts.Count; changeCounter++)
{
object modifiedEntity = this.GetChangeSet().Inserts[changeCounter];
SetAuditStamp(this, modifiedEntity, ChangeType.Insert);
}
base.SubmitChanges(failureMode);
Нам, в частности, не нравится использовать триггеры, так как они всегда скрыты в вашей БД, и это затрудняет решение проблем, которые могут возникнуть ... имея это в своем коде, вам просто нужно отладить его, чтобы выяснить, почему что-то не получилось, например ...