LINQ to SQL - получить объект, изменить, SubmitChanges () создает новые объекты - PullRequest
1 голос
/ 18 ноября 2009

Я боролся с этим некоторое время. Я пытаюсь реализовать ассоциацию много-к-одному. У меня есть куча строк в таблице, называемых чтениями. Они накапливаются со временем, и время от времени я хочу экспортировать их. Когда я экспортирую их, я хочу создать новый объект с именем ExportEvent, чтобы отслеживать, какие строки были экспортированы, чтобы их можно было повторно экспортировать в случае необходимости. Следовательно, чтение имеет отношение внешнего ключа к NULL, поскольку я создаю показания перед тем, как экспортировать их.

Что я обнаружил, так это то, что когда я затем выполняю экспорт, я сначала создаю ExportEvent (evt) и добавляю показания, используя

evt.Readings.AddRange(), 

или если я использую

foreach(reading) 
reading.ExportEvent = evt

Когда я вызываю SubmitChanges, я всегда получаю новую группу показаний, созданных с помощью ассоциации evt, и исходные записи не обновляются.

Я сократил это до самого простого, просто чтобы посмотреть, смогу ли я создать два объекта без ассоциации, и я даже обнаружил, что когда я просто извлекал все показания и обновлял для них значение int, submitchanges все еще вставлял связку новых записей. Что происходит?

Ответы [ 2 ]

3 голосов
/ 25 ноября 2009

Хммм. Интересно - просто нажал на эту ссылку в моих закладках и обнаружил, что вопрос воскрес, поэтому предоставит (неловкое) решение. Все мои объекты имеют свойства данных аудита - CreatedDate и updatedDate. Поэтому я реализовал частичные методы для вставки и обновления каждого объекта в текстовом данных. Я скопировал и вставил (как часто это является причиной некоторого сбоя) некоторые из этих методов вставки и обновления для вновь создаваемых объектов. В результате я также скопировал ошибку, когда методы Update [blah] вызывали ExecuteDynamicInsert вместо ExecuteDynamicUpdate.

Достаточно сказать, что я был очень расстроен, когда в течение 3 часов я отчаянно пытался решить эту проблему, но обнаружил, что это произошло из-за (глупой) ошибки копирования / вставки - и только найти ошибку примерно через 3 минуты. после того, как я отправил этот вопрос!

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 18 ноября 2009

Я подозреваю, что это потому, что вы звоните AddRange(). Это добавит новые объекты в контекст данных. Вместо этого вы должны попытаться просто присоединить существующие объекты, вызвав Attach() в вашем контексте данных.

(Или, если вы никогда не отсоединили их и у вас все еще есть исходный контекст данных, вам не нужно ничего делать, просто внесите изменения в объекты и вызовите SubmitChanges())

...