Linq to SQL:为什么“这个SqlTransaction已经完成;它不再可用了。”

时间:2010-07-27 20:27:44

标签: c# linq-to-sql

我有三个彼此相关的表。它们代表了一个分层对象。

A_Table-> B_Table -> C_Table

我将错误归结为将主键值设置为与之前相同的值。当我提交更改()时,它在大约30秒后失败,错误为:

"This SqlTransaction has completed; it is no longer usable."

我知道主键值之前和之后都是相同的。我的印象是Linq to SQL仅修改字段值,如果它们不等于现有字段值。此代码期间的dataContext.Log和失败不包括SQL更新语句。

为什么会失败?它真的试图进行某种RAM内级联更新吗?

1 个答案:

答案 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();
            }
        }
    }
}

您的主键值是否为整数,并且您的代码是否会检查上一个值?