gpt4 book ai didi

c# - Linq 到 SQL : Dynamic insert during an update to another entity

转载 作者:行者123 更新时间:2023-11-30 22:26:18 26 4
gpt4 key购买 nike

我正在使用 Linq to SQL,并且有一个场景,我想在更新特定记录时插入到表中。

假设我有 Table1Table2,每当 Table1 中的记录更新时,我想在 中插入一条新记录>表 2

目前我有工作代码,允许我在 Table1 更新时更新几个字段,这是通过为 UpdateTable1 创建部分方法实现的函数,像这样:

partial void UpdateTable1(Table1 instance)
{
//update some fields
this.ExecuteDynamicUpdate(instance);
}

这非常有用,我想用它来确保在更新 Table1 时始终在 Table2 中创建新记录。顺便说一句,这主要用于记录目的。

所以这就是我接下来尝试做的事情:

partial void UpdateTable1(Table1 instance)
{
//update some fields
this.ExecuteDynamicUpdate(instance);
this.ExecuteDynamicInsert(instance.ConvertToTable2());
}

(我这里使用的是扩展方法,基于Table1实例创建Table2记录)

问题是我收到以下错误:

The operation cannot be performed for the entity because it is not being change tracked.

我有什么想法可以让这项工作成功吗?

最佳答案

忘记我不可靠的解决方法(如果必须的话,请查看编辑历史记录),我找到了一种更可靠的方法来完成这项工作!

首先,忘记为此使用部分方法(例如问题中的 UpdateTable1),除非您仅修改实例记录的数据,否则效果不佳。所以我保留了这些局部方法只是因为我需要更新实例中的相关字段。

实现此目的的方法是覆盖部分 DataContext 类中的 SubmitChanges 方法。这将允许在您允许默认的 SubmitChanges 处理(并因此锁定此功能)之前插入/更新/删除任何表记录。

在覆盖内,您可以使用 this.GetChangeSet() 访问当前的 DataContext 更改集,由此您可以循环所有更改并执行所需的任何其他表工作(例如添加日志记录)。

对于下面的示例,假设我有一个名为 Table1 的标准数据库表和一个名为 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 类型测试的替代方法可以是 found here .我实际上在我的代码中使用了它并且它工作得非常好,我怀疑它是否有性能优势但是当你需要切换 50 多种类型时它确实有助于使事情更具可读性。

关于c# - Linq 到 SQL : Dynamic insert during an update to another entity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11936254/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com