2010-07-27 102 views
1

我有三个相互关联的表格。它们代表一个分层对象。Linq to SQL:为什么“此SqlTransaction已完成;它不再可用”。

A_Table-> B_Table -> C_Table 

我钻出我的错误,将主键值设置为与以前相同的值。当我的SubmitChanges(),它约30秒后失败的一个错误:

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

我知道主键值之前和之后是相同的。我觉得Linq to SQL只会修改字段值,如果它们不等于现有的字段值。此代码中的dataContext.Log和失败不包含SQL更新语句。

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

+0

是否有您的DataContext在所有得到刷新任何机会呢? – thaBadDawg 2010-07-27 20:30:03

+0

在代码之前的一行,我添加了一个dataContext.SubmitChanges(),它正常工作。 – 2010-07-27 20:32:33

回答

1

默认所有Sql的Linq生成的对象实现INotifyPropertyChanging其中的DbContext将用于改变跟踪和在这种情况下,不会检测设置相同值。

只有在对象未实现INotifyPropertyChanging的情况下,更改跟踪机制才会使用该对象的隐藏副本来检测对SubmitChanges()的调用期间的更改。

看看Object States and Change-Tracking (LINQ to SQL)对于更改跟踪的解释。

---更新:其实,这是不完全正确的;这里是从LINQ到SQL类的摘录从的DbContext designer.cs文件:

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

是你的主键值整数,它的代码检查以前的值也是这样吗?

相关问题