6

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

父母与孩子有关联,但似乎我不能简单地在 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);
        }
    }
}

这将是理想的,但不幸的是,新创建的Child记录没有插入到数据库中。有道理,因为 DataContext 有一个对象/语句列表,并且可能不喜欢在其中添加新项目。

同样,拦截partial void InsertParent(Parent instance)DataContext 中的函数并尝试添加Child记录会产生相同的结果 - 没有错误,但没有任何内容添加到数据库中。

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

更新:OnValidate()和函数 都是InsertParent()从 DataContext 的SubmitChanges()函数中调用的。InsertOnSubmit()我怀疑这是我正在尝试做的事情的固有困难- DataContext在将现有更改提交到数据库的过程中不允许插入其他对象(例如通过)。

理想情况下,我希望将所有内容都保留在一个事务下,这样,如果在插入/更新期间发生任何错误,数据库中实际上不会发生任何变化。因此,我尝试模仿 SQL 触发器功能,允许通过对 DataContextSubmitChanges()函数的一次调用自动插入子记录。

4

3 回答 3

6

如果您希望它在保存之前发生;您可以覆盖SubmitChanges, 并调用GetChangeSet()以获取待处理的更改。查找您感兴趣的内容(例如,delta.Inserts.OfType<Customer>(),并进行所需的更改。

然后调用base.SubmitChanges(...)

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

于 2009-08-08T09:53:32.047 回答
2

Add方法仅在两个对象之间建立链接:它不会将添加的项目标记为插入数据库。为此,您需要调用DataContext 中包含InsertOnSubmit的实例。Table<Child>当然,问题在于没有天生的方法可以从您描述的方法中访问您的 DataContext 。

您确实可以通过在 DataContext 中实现来访问它InsertParent,所以我会走那条路(当然,使用InsertOnSubmit而不是Add)。

已编辑我假设部分方法InsertParent会在某个时候被调用DataContext,但是在查看我自己的代码时,该方法似乎已定义但从未被生成的类引用。那么有什么用,我想知道吗?

于 2009-08-06T18:33:30.280 回答
0

在 linq to sql 中,您通过为 dbml 文件创建一个部分类,然后插入一个部分方法来创建一个“触发器”。这是一个不会做任何事情的示例,因为它调用了内置删除。

partial void DeleteMyTable(MyTable instance)
{
    //custom code here
    ExecuteDynamicDelete(instance);
    //or here :-)
}
于 2015-02-19T15:16:35.503 回答