Конфликт параллелизма LINQ to SQL - выглядит как чистое присоединение с правильным управлением версиями строк.

Я пытаюсь заставить 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) )


Соответствующие атрибуты свойства modified_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


И результирующие атрибуты в объявлении свойства modified_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 перед присоединением.

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


person Rex Miller    schedule 22.10.2008    source источник
comment
Да, и я попытался установить проверку обновлений: никогда и для всех других свойств клиентского объекта в конструкторе DBML, чего бы это ни стоило.   -  person Rex Miller    schedule 22.10.2008


Ответы (1)


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

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

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

person Amy B    schedule 22.10.2008
comment
Бесконечно благодарен. Это прояснило то, чего мне не хватало при повторном присоединении объекта к DataContext: свойства присоединенного объекта, которые не были явно заданы для операции сохранения, пусты, и обновление пытается сохранить их поверх текущих сохраненных значений ... Ух! Не то, что я хотел. - person Rex Miller; 22.10.2008