LINQ SQL Attach, проверка обновлений установлена ​​на «Никогда», но все равно конфликты параллелизма - PullRequest
3 голосов
/ 09 апреля 2010

В конструкторе dbml я установил Проверка обновления на Никогда для всех свойств. Но я все еще получаю исключение при выполнении Attach: «Была сделана попытка присоединить или добавить объект, который не является новым, возможно, загружен из другого DataContext. Это не поддерживается» Этот подход, похоже, сработал для других здесь, но, должно быть, я кое-что упустил.

        using(TheDataContext dc = new TheDataContext())
        {
            test = dc.Members.FirstOrDefault(m => m.fltId == 1);
        }

        test.Name = "test2";

        using(TheDataContext dc = new TheDataContext())
        {
            dc.Members.Attach(test, true);
            dc.SubmitChanges();
        }

Ответы [ 3 ]

2 голосов
/ 09 апреля 2010

В сообщении об ошибке указано, что именно идет не так: вы пытаетесь прикрепить объект, который был загружен из другого DataContext, в вашем случае из другого экземпляра DataContext. Не удаляйте свой DataContext (в конце оператора using, который он удаляет), прежде чем изменять значения и отправлять изменения. Это должно работать (все в одном using утверждении). Я только что увидел, что вы хотите снова прикрепить объект к коллекции членов, но он уже там. Не нужно этого делать, это должно работать так же хорошо:

using(TheDataContext dc = new TheDataContext())
{
    var test = dc.Members.FirstOrDefault(m => m.fltId == 1);
    test.Name = "test2";
    dc.SubmitChanges();
}

Просто измените значение и отправьте изменения.

Последнее обновление:

(удалены все предыдущие 3 обновления)

Мое предыдущее решение (снова удалено из этого поста), найдено здесь опасно. Я только что прочитал это в статье MSDN :

"Вызывать методы Attach можно только на новых или десериализованные объекты. Единственный способ для сущности быть отделенным от его исходный контекст данных для него должен быть сериализованная. Если вы попытаетесь прикрепить непривязанная сущность к новым данным контекст, и эта сущность по-прежнему имеет отложенные загрузчики от предыдущего контекст данных, LINQ to SQL будет выброшен исключение. Сущность с отложенным загрузчики из двух разных данных контексты могут привести к нежелательным результатам когда вы выполняете вставку, обновление и удалить операции на этом объекте. За больше информации об отсрочке загрузчики, см. Отложено против Немедленно Загрузка (LINQ to SQL). "

Используйте это вместо:

// Get the object the first time by some id
using(TheDataContext dc = new TheDataContext())
{
    test = dc.Members.FirstOrDefault(m => m.fltId == 1);
}

// Somewhere else in the program
test.Name = "test2";

// Again somewhere else
using(TheDataContext dc = new TheDataContext())
{
    // Get the db row with the id of the 'test' object
    Member modifiedMember = new Member()
    {
        Id = test.Id,
        Name = test.Name,
        Field2 = test.Field2,
        Field3 = test.Field3,
        Field4 = test.Field4
    };

    dc.Members.Attach(modifiedMember, true);
    dc.SubmitChanges();
}

После копирования объекта все ссылки отсоединяются, и все обработчики событий (отложенная загрузка из db) не подключаются к новому объекту. Только поля значений копируются в новый объект, который теперь можно безопасно прикрепить к таблице членов. Кроме того, вам не нужно запрашивать БД во второй раз с этим решением.

0 голосов
/ 21 октября 2014

Это функция в моем классе репозитория, которую я использую для обновления сущностей

protected void Attach(TEntity entity)
{
   try
    {
       _dataContext.GetTable<TEntity>().Attach(entity);
       _dataContext.Refresh(RefreshMode.KeepCurrentValues, entity);
    }
    catch (DuplicateKeyException ex) //Data context knows about this entity so just update values
    {
       _dataContext.Refresh(RefreshMode.KeepCurrentValues, entity);
    }
}

Где TEntity - ваш класс БД, и в зависимости от ваших настроек вы можете просто захотеть сделать

_dataContext.Attach(entity);
0 голосов
/ 09 апреля 2010

Возможно присоединение сущностей из другого текста данных.

Единственное, что нужно добавить к коду в первом посте, это:

dc.DeferredLoadingEnabled = false

Но это недостаток, поскольку отложенная загрузка очень полезна. Где-то на этой странице я читал, что другим решением было бы установить проверку обновлений для всех свойств на «Никогда». Этот текст говорит то же самое: http://complexitykills.blogspot.com/2008/03/disconnected-linq-to-sql-tips-part-1.html

Но я не могу заставить его работать, даже после того, как для проверки обновлений было установлено значение Никогда.

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