Я получаю эту ошибку, если я выполняю следующие действия:
- Измените свойство Y объекта (связанное свойство объекта)
- Попытка представить изменения
- В этот момент значение Y и значение X (базовый ключ) не согласуются - LINQ to SQL, по-видимому, не синхронизирует их до тех пор, пока не будет вызван GetChangeSet.
- Ожидаемая ошибка возникает из-за некоторых ограничений бизнес-логики или уровня базы данных во время операции обновления.
- В этот момент значение Y согласуется с X, потому что был вызван GetChangeSet.
- Измените значение Y на Nothing (aka null).
- Вызвать GetChangeSet.
Ошибка возникает на последнем шаге, потому что значение X и исходное значение X (возвращено GetOriginalEntityState) различны, а новое значение не согласуется с Y? Вот почему? Это ошибка в LINQ to SQL. Должно быть потому, что я не вижу такого же поведения, если вместо Y вместо Y вместо другого изменить значение (не нулевое). Каков правильный путь? Я вижу несколько способов:
- Отбросить DataContext при возникновении ошибки и оставить UI as-is. Мне это не нравится, потому что оптимистические конфликты с изменением коллаборации не могут быть обнаружены. Новый контекст не имеет исходных значений, которые были заполнены в то же время, когда пользовательский интерфейс был заполнен, поэтому, если в пользовательском интерфейсе есть какие-то устаревшие значения, они приведут к возврату данных в базе данных.
- Обновите datacontext (OverwriteCurrent) и оставьте пользовательский интерфейс как есть. Мне не нравится это по той же причине, что и # 1.
- Обновите datacontext (OverwriteCurrent) и повторно заполните пользовательский интерфейс. Мне это не нравится, потому что сообщение об ошибке, только что представленное пользователю, не показывает пользователю ошибку, которую они сделали, и позволяет им исправить ее. Он также отбрасывает все другие изменения, которые пользователь мог сделать.
- При возникновении ошибки явным образом извлекаю ключ для Y, который соответствует исходному значению X и reset Y, затем вызывает GetChangeSet для повторной синхронизации X (X доступен только для чтения или закрыт, поэтому я не могу reset он напрямую). Это похоже на работу, но похоже на хак и может потребовать много кода для других подобных ошибок.
Есть ли лучшее решение. Это что-то, о чем следует сообщить?