Разрешать конфликты параллелизма путем перезаписи значений базы данных удаленных объектов (LINQ to SQL)

#linq-to-sql #conflict

#linq-to-sql #конфликт

Вопрос:

Я хочу реализовать несколько общий обработчик конфликтов.

В процессе я столкнулся со случаем, когда конфликт возникает из-за попытки изменить удаленный объект.

В общем, я хочу, чтобы пользователь выбирал, сохранять ли свои изменения, несмотря ни на что, или отменить их. Вот почему мой обработчик запрашивает обратную связь у пользователя.

Поэтому я хочу иметь возможность, если / когда я столкнусь с удаленным объектом, повторно вставить этот объект, если пользователь решит это сделать.

Я пытался использовать Metatable данные ObjectChangeConflict для Insert объекта в Datatable , но, хотя объекта больше нет в таблице (не отображается в контексте данных), я получаю исключение, что я не могу добавить уже существующий объект.

Мой код следующий:

 GmngrDatabaseContextDataContext formDbContext;
RefreshMode UserSelectedConfilctResolutionSceme; 
  

 // resolve all conflicts according to the desires of the user
foreach (ObjectChangeConflict occ in formDbContext.ChangeConflicts)
{
    occ.Resolve(UserSelectedConfilctResolutionSceme, true);

    // Conflicted due to deleted object?
    if (occ.IsDeleted amp;amp; UserSelectedConfilctResolutionSceme == RefreshMode.KeepCurrentValues)
    {
        try
        {
            MetaTable metatable = formDbContext.Mapping.GetTable( occ.Object.GetType() );
            formDbContext.GetTable( metatable.RowType.Type ).InsertOnSubmit( occ.Object );
        }
        catch (Exception ex)
        {
            string err = ex.Message;
        }
    }
}

formDbContext.SubmitChanges(ConflictMode.FailOnFirstConflict);
  

Как еще я могу выполнить эту задачу?
Заранее благодарю вас.

Ответ №1:

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

Я могу придумать 2 варианта этого:

  1. Если вам не нужно, чтобы первичный ключ совпадал с ключом удаленного объекта (например, если ключ является просто идентификатором), вы можете создать новый объект, скопировать значения конфликтующего объекта в этот новый объект и вставить его вместо объекта, который не удался.

  2. Если первичный ключ важен, и вы настаиваете на том, чтобы вставить объект, который у вас в руках, я предлагаю использовать другой datacontext, который не «знает» этот объект, и вставить его, используя этот контекст.

Надеюсь, это поможет,

Коби