I'm using the DataSet
/DataTable
/DataAdapter
architecture to mediate between the database and my model objects, which have their own backing (they aren't backed by a DataRow). I've got a DataAdapter
with AcceptChangesDuringFill = False
, AcceptChangesDuringUpdate = False
, and FillLoadOption = OverwriteChanges
. Here's my understanding of the DataAdapter
model under these conditions:
DataAdapter.Update()
DataRowState.Added
will result in theInsertCommand
firingDataRowState.Modified
will result in theUpdateCommand
firingDataRowState.Deleted
will result in theDeleteCommand
firing
DataAdapter.Fill()
- Any row in the returned result set whose primary key corresponds to an existing row in the
DataTable
will be used to update that row, and that row's state will always becomeDataRowState.Modified
, even if the returned row is identical to the current row - Any row in the returned result set whose primary key doesn't correspond to any existing row will be used to create a new row, and that row's state will become
DataRowState.Added
- Any row in the
DataTable
that doesn't correspond to a row in the returned result set will stay atDataRowState.Unchanged
Given that I'm correct with this mental model, suppose I want to use Fill()
to notice deleted rows in the data source. Also, suppose that the parameters of the SelectCommand
don't return the entire table. I'm guessing that I have two options:
- Find all the rows that should've been updated by the
Fill()
but are stillDataRowState.Unchanged
(relies on my untested italicized assumption above). These rows have been deleted at the data source. - Clear all relevant rows from the
DataTable
before theFill()
; any row that doesn't show up again has been deleted at the data source. This loses the distinction betweenDataRowState.Added
andDataRowState.Modified
that is preserved with the first method.
So, my questions:
- Is my above model of the
DataAdapter
correct, subject to the property values I noted at the top? - Which option should I go with to find deleted rows? I'd prefer the first one, but that relies on my assumption that all returned rows will be set to
DataRowState.Modified
even if the row is identical; is that a safe assumption? - Am I going about this all wrong?