使用LINQ-to-SQL模仿SQL插入触发器

Bra*_*onB 6 linq datacontext triggers submitchanges linq-to-sql

使用LINQ-to-SQL,我想在插入父实体时自动创建子记录.基本上,模仿SQL Insert触发器的工作方式,但是在代码中,以便可以进行一些额外的处理.

父亲与孩子有关联,但似乎我不能简单地在DataContext期间添加新的子记录SubmitChanges().

例如,

public partial class Parent 
{
    partial void OnValidate(System.Data.Linq.ChangeAction action)
    {
        if(action == System.Data.Linq.ChangeAction.Insert)
        {
            Child c = new Child();
            ... set properties ...
            this.Childs.Add(c);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这将是理想的,但遗憾的是新创建的Child记录未插入数据库.有道理,因为DataContext有一个对象/语句列表,可能不喜欢在它的中间添加新项目.

类似地,拦截partial void InsertParent(Parent instance)DataContext中的函数并尝试添加Child记录会产生相同的结果 - 没有错误,但没有添加到数据库中.

有没有办法在不向表示层添加代码的情况下获得此类行为?

更新: 无论是OnValidate()InsertParent()功能从DataContext的就是所谓的SubmitChanges()功能.我怀疑这是我正在尝试做的事情的固有困难 - 在将InsertOnSubmit()现有更改提交到数据库的过程中,DataContext将不允许插入其他对象(例如,通过).

理想情况下,我希望将所有内容保留在一个Transaction下,以便在插入/更新期间发生任何错误时,数据库中实际上没有任何更改.因此,我尝试模仿SQL触发器功能,允许通过对DataContext SubmitChanges()函数的单次调用自动插入子记录.

Mar*_*ell 6

如果你希望它在保存之前发生; 您可以覆盖SubmitChanges,并调用GetChangeSet()以获取挂起的更改.寻找您感兴趣的事物(例如delta.Inserts.OfType<Customer>(),并进行必要的更改.

然后打电话base.SubmitChanges(...).

这是一个相关的例子,处理删除.