Linq to SQL: почему «Эта SqlTransaction завершена; она больше не может использоваться». - PullRequest
1 голос
/ 28 июля 2010

У меня есть три таблицы, связанные друг с другом. Они представляют собой иерархический объект.

A_Table-> B_Table -> C_Table

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

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

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

Почему это не получится? Действительно ли он пытается выполнить какое-то каскадное обновление в оперативной памяти?

1 Ответ

1 голос
/ 28 июля 2010

По умолчанию все сгенерированные объекты Linq to Sql реализуют INotifyPropertyChanging, который DBContext будет использовать для отслеживания изменений и в этом случае он не обнаружит установку идентичного значения.

Только в тех случаях, когда объект не реализует INotifyPropertyChanging, механизм отслеживания изменений будет использовать скрытую копию объекта для обнаружения изменений во время вызовов SubmitChanges().

Посмотрите Состояния объектов и отслеживание изменений (LINQ to SQL) для объяснения отслеживания изменений.

--- Обновление: это на самом деле не совсем правильно; Вот выдержка из класса Linq to 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();
            }
        }
    }
}

Являются ли значения первичного ключа целыми числами и проверяет ли ваш код предыдущее значение следующим образом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...