我有三个彼此相关的表。它们代表了一个分层对象。
A_Table-> B_Table -> C_Table
我将错误归结为将主键值设置为与之前相同的值。当我提交更改()时,它在大约30秒后失败,错误为:
"This SqlTransaction has completed; it is no longer usable."
我知道主键值之前和之后都是相同的。我的印象是Linq to SQL仅修改字段值,如果它们不等于现有字段值。此代码期间的dataContext.Log和失败不包括SQL更新语句。
为什么会失败?它真的试图进行某种RAM内级联更新吗?
答案 0 :(得分:1)
默认情况下,所有Linq to Sql生成的对象都实现INotifyPropertyChanging
,DBContext将使用它来进行更改跟踪,在这种情况下,它不会检测设置相同的值。
仅在对象未实现INotifyPropertyChanging
的情况下,更改跟踪机制才会使用对象的隐藏副本来检测调用SubmitChanges()
期间的更改。
请查看Object States and Change-Tracking (LINQ to SQL)以获取有关更改跟踪的说明。
---更新:这实际上并不完全正确;这是从DBContext designer.cs文件中的Linq到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();
}
}
}
}
您的主键值是否为整数,并且您的代码是否会检查上一个值?