C# Linq对SQL:为什么;此事务已完成;它不再可用。”;
我有三张相互关联的桌子。它们表示层次对象C# Linq对SQL:为什么;此事务已完成;它不再可用。”;,c#,linq-to-sql,C#,Linq To Sql,我有三张相互关联的桌子。它们表示层次对象 A_Table-> B_Table -> C_Table 我将错误向下钻取,将主键值设置为与以前相同的值。当我SubmitChanges()时,它会在大约30秒后失败,错误为: "This SqlTransaction has completed; it is no longer usable." 我知道主键值在前后是相同的。我的印象是,LINQtoSQL只在字段值与现有字段值不相等时修改字段值。此代码和故障期间的dataContext.
A_Table-> B_Table -> C_Table
我将错误向下钻取,将主键值设置为与以前相同的值。当我SubmitChanges()时,它会在大约30秒后失败,错误为:
"This SqlTransaction has completed; it is no longer usable."
我知道主键值在前后是相同的。我的印象是,LINQtoSQL只在字段值与现有字段值不相等时修改字段值。此代码和故障期间的dataContext.Log不包括SQL更新语句
为什么会失败?它真的在尝试进行某种RAM内级联更新吗?默认情况下,所有Linq到Sql生成的对象都实现了
INotifyPropertyChanging
,DBContext将使用它进行更改跟踪,在这种情况下,它不会检测到设置相同的值
只有在对象未实现INotifyPropertyChanging
的情况下,更改跟踪机制才会在调用SubmitChanges()
期间使用对象的隐藏副本来检测更改
请查看以了解更改跟踪的解释
---更新:这实际上并不完全正确;以下是DBContext designer.cs文件中Linq to Sql类的摘录:
[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.Tasks")]
public partial class Task : INotifyPropertyChanging, INotifyPropertyChanged
{
private int _TaskId;
[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_TaskId", AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
public int TaskId
{
get
{
return this._TaskId;
}
set
{
if ((this._TaskId != value))
{
this.OnTaskIdChanging(value);
this.SendPropertyChanging();
this._TaskId = value;
this.SendPropertyChanged("TaskId");
this.OnTaskIdChanged();
}
}
}
}
您的主键值是整数吗?您的代码是否像这样检查以前的值?默认情况下,所有Linq到Sql生成的对象都实现
InotifyPropertyChange
,DBContext将使用它进行更改跟踪,在这种情况下,它不会检测到设置相同的值
只有在对象未实现INotifyPropertyChanging
的情况下,更改跟踪机制才会在调用SubmitChanges()
期间使用对象的隐藏副本来检测更改
请查看以了解更改跟踪的解释
---更新:这实际上并不完全正确;以下是DBContext designer.cs文件中Linq to Sql类的摘录:
[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.Tasks")]
public partial class Task : INotifyPropertyChanging, INotifyPropertyChanged
{
private int _TaskId;
[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_TaskId", AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
public int TaskId
{
get
{
return this._TaskId;
}
set
{
if ((this._TaskId != value))
{
this.OnTaskIdChanging(value);
this.SendPropertyChanging();
this._TaskId = value;
this.SendPropertyChanged("TaskId");
this.OnTaskIdChanged();
}
}
}
}
您的主键值是整数吗?您的代码是否像这样检查以前的值?您的DataContext是否有可能被刷新?在代码前一行,我添加了一个DataContext.SubmitChanges(),它工作正常。您的DataContext是否有可能被刷新?在代码前一行,我添加了一个dataContext.SubmitChanges(),它工作正常。