ОК. Я нашел решение, но кажется, что это скорее взлом, чем настоящее решение ... наверняка есть лучший способ исправить это?
Я поместил блок catch в свой код LINQ (в функции Save ()) следующим образом:
if (sx.Message.IndexOf("Violation of UNIQUE KEY constraint 'UN_CompanyContact_Value'.") == 0)
{
//this will refresh the cache... so you won't see things that violate constraints
//showing on the SearchCompanyContacts if you return from Edit CC screen...
db.Refresh(RefreshMode.OverwriteCurrentValues, db.CompanyContacts);
throw sx;
}
else
{
throw sx;
}
это кажется очень пустым и неудовлетворительным .. Мне действительно не нравится тот факт, что я ловлю и перебрасываю исключение, но это единственный способ получить некоторые детали, объясняющие, почему не удалось сохранить ... это не будет было бы необходимо, если бы мне не нужно было делать вызов db.Refresh () ... (я мог бы просто позволить SqlException пузыриться в стеке вызовов, и я мог бы обработать это с помощью класса ExceptionHandler) ...
Я также изменил логику, так что я возвращаю NULL с экрана Edit, если пользователь отменяет, затем на экране поиска, у меня тоже есть это небольшое изменение ...
selectedCompanyContact = editCompanyContact.EditCompanyContact(selectedCompanyContact.CompanyContactId);
if (selectedCompanyContact == null)
{
//refresh from db..
ExecuteSearch();
}
, чтобы на экране поиска обновлялись результаты поиска и отображалось значение «сброс» (т.е. исходные данные).
но, конечно, это не может быть правильным способом написания LINQ? Я ожидал бы, что есть какой-то параметр, который я могу определить, который говорит, что если база данных отклоняет его (нарушен UNIQUE CONSTRAINT, нарушен FOREIGN KEY и т. Д.), То выбрасывает материал, кэшированный в коллекции, который нарушает любые правила базы данных ... сейчас интересно то, что экран поиска и экран редактирования не сразу стирают то, что набрал пользователь, но как только я нажимаю кнопку «Отмена», экран «обновляется», и вы видите исходное значение ...
одна вещь, которая мне нравится в этом решении, это то, что по крайней мере экран (Редактировать) не закрывается, если вы нарушаете правило (вы получаете сообщение «дублирующаяся запись существует»), и вы все равно можете видеть ваши данные «без изменений» в поля, которые привязаны к объекту «для сохранения», так что вы можете просмотреть данные и сказать «ага ... я понимаю, почему эти данные были отклонены», тогда вы можете изменить свои данные, и кнопка «ОК» будет продолжать отклонять ваши неверные данные до тех пор, пока ваши данные не будут соответствовать всем правилам, определенным в базе данных, поэтому, если вы хотите, вы можете нажать кнопку ОТМЕНА, тогда она отменит ваши изменения, и экран результатов поиска обновится до «старых данных».
Я был заинтригован этой функцией:
db.CompanyContacts.Context.GetChangeSet().Updates.Clear();
но, к сожалению, это список только для чтения, поэтому вызов этого не удаётся ... но мне интересно, есть ли способ использовать объект из списка (например, db.CompanyContacts.Context.GetChangeSet (). Updates [0 ]) чтобы иметь возможность вывести нарушающее существо или отсоединить / прикрепить - не уверен, что я чего-то упускаю или нет, но это так.
Я серьезно ... и не называй меня Ширли ...; -)