代码之家  ›  专栏  ›  技术社区  ›  Zachary Scott

linq to sql:why“此sqlTransaction已完成;它不再可用。”

  •  1
  • Zachary Scott  · 技术社区  · 14 年前

    我有三张桌子相互关联。它们表示一个层次对象。

    A_Table-> B_Table -> C_Table
    

    我钻取了我的错误,将主键值设置为与以前相同的值。当我提交changes()时,它在大约30秒后失败,错误为:

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

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

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

    1 回复  |  直到 14 年前
        1
  •  1
  •   joshperry    14 年前

    默认情况下,所有Linq to SQL生成的对象实现 INotifyPropertyChanging dbContext将用于更改跟踪,在这种情况下,它将检测不到设置相同的值。

    仅在对象未实现的情况下 InotifyProperties悬挂 更改跟踪机制是否将使用对象的隐藏副本在调用期间检测更改 SubmitChanges() .

    看一看 Object States and Change-Tracking (LINQ to SQL) 有关更改跟踪的说明。

    ---更新:这实际上不完全正确;下面是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();
                }
            }
        }
    }
    

    您的主键值是整数吗?您的代码是否像这样检查以前的值?