#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 варианта этого:
-
Если вам не нужно, чтобы первичный ключ совпадал с ключом удаленного объекта (например, если ключ является просто идентификатором), вы можете создать новый объект, скопировать значения конфликтующего объекта в этот новый объект и вставить его вместо объекта, который не удался.
-
Если первичный ключ важен, и вы настаиваете на том, чтобы вставить объект, который у вас в руках, я предлагаю использовать другой datacontext, который не «знает» этот объект, и вставить его, используя этот контекст.
Надеюсь, это поможет,
Коби