internal void ChangeRelationshipState(EntityEntry targetEntry, RelatedEnd relatedEnd, EntityState requestedState) { Debug.Assert(requestedState != EntityState.Modified, "Invalid requested state for relationsihp"); Debug.Assert(State != EntityState.Modified, "Invalid initial state for relationsihp"); var initialState = State; switch (initialState) { case EntityState.Added: switch (requestedState) { case EntityState.Added: // no-op break; case EntityState.Unchanged: AcceptChanges(); break; case EntityState.Deleted: AcceptChanges(); // cascade deletion is not performed because TransactionManager.IsLocalPublicAPI == true Delete(); break; case EntityState.Detached: // cascade deletion is not performed because TransactionManager.IsLocalPublicAPI == true Delete(); break; default: Debug.Assert(false, "Invalid requested state"); break; } break; case EntityState.Unchanged: switch (requestedState) { case EntityState.Added: ObjectStateManager.ChangeState(this, EntityState.Unchanged, EntityState.Added); State = EntityState.Added; break; case EntityState.Unchanged: //no-op break; case EntityState.Deleted: // cascade deletion is not performed because TransactionManager.IsLocalPublicAPI == true Delete(); break; case EntityState.Detached: // cascade deletion is not performed because TransactionManager.IsLocalPublicAPI == true Delete(); AcceptChanges(); break; default: Debug.Assert(false, "Invalid requested state"); break; } break; case EntityState.Deleted: switch (requestedState) { case EntityState.Added: relatedEnd.Add( targetEntry.WrappedEntity, applyConstraints: true, addRelationshipAsUnchanged: false, relationshipAlreadyExists: true, allowModifyingOtherEndOfRelationship: false, forceForeignKeyChanges: true); ObjectStateManager.ChangeState(this, EntityState.Deleted, EntityState.Added); State = EntityState.Added; break; case EntityState.Unchanged: relatedEnd.Add( targetEntry.WrappedEntity, applyConstraints: true, addRelationshipAsUnchanged: false, relationshipAlreadyExists: true, allowModifyingOtherEndOfRelationship: false, forceForeignKeyChanges: true); ObjectStateManager.ChangeState(this, EntityState.Deleted, EntityState.Unchanged); State = EntityState.Unchanged; break; case EntityState.Deleted: // no-op break; case EntityState.Detached: AcceptChanges(); break; default: Debug.Assert(false, "Invalid requested state"); break; } break; default: Debug.Assert(false, "Invalid entry state"); break; } }