示例#1
0
        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;
            }
        }