Конфликт параллелизма LINQ to SQL - выглядит как чистое вложение с правильным версионированием строк - PullRequest
3 голосов
/ 22 октября 2008

Я пытаюсь заставить LINQ to SQL сохранить изменения в прикрепленном объекте, в котором у вспомогательной таблицы есть столбец DateTime, который, как мне кажется, должен функционировать для контроля версий строк, как описано здесь .

Таблица выглядит так:

CREATE TABLE [dbo].[client](
[client_id] [int] IDENTITY(1,1) NOT NULL,
[client_address1] varchar(100) NULL,
/* snip */
[modified_date] datetime NOT NULL,
CONSTRAINT [PK_CLIENT] PRIMARY KEY CLUSTERED ([client_id] ASC) )


Соответствующие атрибуты в свойствеified_date установлены так же в конструкторе DBML:

Auto Generated Value: True
Auto-Sync: Always
Nullable: False
Primary Key: False
Read Only: False
Server Data Type: DateTime
Source: modified_date
Time Stamp: True
Update Check: Never


И получающиеся атрибуты в объявлении свойстваified_date выглядят правильно, насколько я могу сказать:

[Column(Storage="_modified_date", AutoSync=AutoSync.Always, 
DbType="DateTime", IsDbGenerated=true, IsVersion=true, 
UpdateCheck=UpdateCheck.Never)]


Процесс сохранения изменений на клиенте происходит примерно так:

var c = new client { client_id = idOfClientToSave };

c.client_address1 = uxAddress1.Text;

// The DataContext is initialized in the constructor
// of ClientDataAccess
using (var ClientData = new ClientDataAccess())
{
    ClientData.SaveClient(c);
}


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

public int SaveClient(client c)
{
    c.modified_date = DateTime.Now.ToUniversalTime();

    if (c.client_id == 0)
    {
        _db.GetTable<client>().InsertOnSubmit(c);
    }
    else
    {
        _db.GetTable<client>().Attach(c, true);
    }
    try
    {
        _db.SubmitChanges(ConflictMode.ContinueOnConflict);
    }
    catch (ChangeConflictException)
    {
        foreach (var con in _db.ChangeConflicts)
        {
            con.Resolve(RefreshMode.OverwriteCurrentValues);
        }
        throw;
    }
}


Но _db.SubmitChanges (ConflictMode.ContinueOnConflict) по-прежнему генерирует исключение ChangeConflict (как и _db.SubmitChanges ()). Я не вижу, как прикрепленный объект может происходить из текущего DataContext, так как он сам по себе создается и не извлекается из DataContext до присоединения.

Любая помощь будет принята с благодарностью.

1 Ответ

4 голосов
/ 22 октября 2008

Попробуйте загрузить оригинальный объект за новой версией.

else   
{
    _db.GetTable<client>().Attach(c, true);
    _db.Refresh(RefreshMode.KeepCurrentValues, c);
}

Я изучил эту технику из этой статьи в разделе: шаблоны параллелизма для операций обновления (и удаления).

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