У меня есть таблица отношений «многие ко многим» в типизированном DataSet. Для удобства при обновлении я удаляю старые отношения, прежде чем добавлять новые (возможно, такие же, как и раньше).DataTable: удаляет старые DataRows перед тем, как вставить новый сейф?
Теперь я задаюсь вопросом, является ли этот способ безотказным или я должен гарантировать только удаление, которое действительно удалено (например, с LINQ), и добавьте только тот, который действительно является новым.
В SQL-Server есть уникальное ограничение, определенное для таблицы отношений, два внешних ключа являются составным первичным ключом.
Является ли заказ DataAdapter обновлением DataRows, который содержит RowState <> Без изменений предсказуемо или нет? Другими словами: возможно ли, что DataAdapter.Update(DataTable)
приведет к исключению, если ключ уже существует?
Это DataModel:
Это часть кода (LbSymptomCodes
является ListBox ASP.Net):
Dim daTrelRmaSymptomCode As New ERPModel.dsRMATableAdapters.trelRMA_SymptomCodeTableAdapter
For Each oldTrelRmaSymptomCodeRow As ERPModel.dsRMA.trelRMA_SymptomCodeRow In thisRMA.GettrelRMA_SymptomCodeRows
oldTrelRmaSymptomCodeRow.Delete()
Next
For Each item As ListItem In LbSymptomCodes.Items
If item.Selected Then
Dim newTrelRmaSymptomCodeRow As ERPModel.dsRMA.trelRMA_SymptomCodeRow = Services.dsRMA.trelRMA_SymptomCode.NewtrelRMA_SymptomCodeRow
newTrelRmaSymptomCodeRow.fiRMA = Services.IdRma
newTrelRmaSymptomCodeRow.fiSymptomCode = CInt(item.Value)
Services.dsRMA.trelRMA_SymptomCode.AddtrelRMA_SymptomCodeRow(newTrelRmaSymptomCodeRow)
End If
Next
daTrelRmaSymptomCode.Update(Services.dsRMA.trelRMA_SymptomCode)
Спасибо заранее.
Спасибо. Но это приведет к появлению трех DB-вызовов (и трех транзакций) вместо одного. Я не мог RejectChanges, когда обновление завершилось с ошибкой в добавленных строках для уже принятых изменений в удаленных и измененных строках. –
@TimSchmelter: Не могли бы вы обернуть все обновления в одной транзакции в блоке try/catch для отката, если возникнут какие-либо ошибки? – codingbadger
Возможно, но сложно, потому что в типизированном наборе данных эта логика инкапсулируется в автогенерируемые TableAdapters. Я должен был бы расширить эти адаптеры в частичном классе в отдельном файле, чем автогенерированный, и предоставить сам DataAdapter для предоставления транзакции.Но я бы хотел избежать этого лишнего усилия;) –