2010-07-27 2 views
1

У меня есть три таблицы, связанные друг с другом. Они представляют собой иерархический объект.Linq to SQL: Почему «Это SqlTransaction завершено, оно больше не используется».

A_Table-> B_Table -> C_Table 

Я просчитал свою ошибку до установки значений первичного ключа до тех же значений, что и раньше. Когда SubmitChanges I(), он не примерно через 30 секунд с ошибкой:

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

Я знаю, что значения первичного ключа идентичны до и после. У меня создается впечатление, что Linq to SQL только модифицирует значения полей, если они не эквивалентны существующим значениям полей. DataContext.Log во время этого кода и сбой не включают в себя инструкции SQL-обновления.

Зачем это происходит? Это действительно попытка сделать какое-то каскадное обновление в ОЗУ?

+0

Есть ли вероятность, что ваш DataContext обновляется вообще? – thaBadDawg

+0

В одной строке до кода я добавил dataContext.SubmitChanges(), который работал правильно. –

ответ

1

По умолчанию все объекты, созданные Linq to Sql, реализуют 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(); 
      } 
     } 
    } 
} 

Ваши первичные ключевые значения целых чисел и делает ваш код проверки предыдущего значения, как это?

Смежные вопросы