Разрешение конфликтов параллелизма путем перезаписи значений в базе данных удаленных объектов (LINQ to SQL) - PullRequest
0 голосов
/ 05 апреля 2011

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

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

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

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

Я пытался использовать 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 && 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 Ответ

0 голосов
/ 08 мая 2011

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

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

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

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

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

Коби

...