I recently started using Entity Framework, and it has been kind of a pain to check if I really need to add new records to the database or not.
If the Entity I n
ObjectContext
internally tracks all entities which was either loaded by context, attached or added. Only these entities can be modified in database when SaveChanges
is invoked. Each such entity has a ObjectStateEntry
in the ObjectStateManager
. One of the main properties of the ObjectStateEntry
is a State
. The state is of enum type EntityState
which offers these values:
Each entity loaded from the database is in Unchanged
state. Detached is special state. You will not find ObjectStateEntry
with Detached state in the ObjectStateManager
. But if you ask ObjectStateManager
for the ObjectStateEntry
for entity not tracked by the context it will create a new ObjectStateEntry
with Detached
state.
Now the difference between Attach
and AddObject
:
Attach
- if you call this method ObjectContext
will start tracking whole object graph (main entity and all related entities). All entities which were not tracked yet will be set to Unchanged
state. AddObject
- if you call this method ObjectContext
will also start tracking whole object graph (main entity and all related entities). The difference is that all entities which were not tracked yet will be set to Added
state (= new objects which must be set to database).