Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq对SQL:为什么;此事务已完成;它不再可用。”;_C#_Linq To Sql - Fatal编程技术网

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(),它工作正常。