2010-07-27 87 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(); 
      } 
     } 
    } 
} 

是你的主鍵值整數,它的代碼檢查以前的值也是這樣嗎?

相關問題