Beispiel #1
0
        /// <summary>
        /// Adds an entity in a 'pending insert' state to this table.  The added entity will not be observed
        /// in query results from this table until after SubmitChanges() has been called.  Any untracked
        /// objects referenced directly or transitively by the entity will also be inserted.
        /// </summary>
        /// <param name="entity"></param>
        public void InsertOnSubmit(TEntity entity)
        {
            if (entity == null)
            {
                throw Error.ArgumentNull("entity");
            }
            CheckReadOnly();
            context.CheckNotInSubmitChanges();
            context.VerifyTrackingEnabled();
            MetaType type = this.metaTable.RowType.GetInheritanceType(entity.GetType());

            if (type == null)
            {
                throw Error.InheritanceTypeNotRegistered(entity.GetType());
            }
            if (!IsTrackableType(type))
            {
                throw Error.TypeCouldNotBeAdded(type.Type);
            }
            TrackedObject tracked = this.context.Services.ChangeTracker.GetTrackedObject(entity);

            if (tracked == null)
            {
                tracked = this.context.Services.ChangeTracker.Track(entity);
                tracked.ConvertToNew();
            }
            else if (tracked.IsWeaklyTracked)
            {
                tracked.ConvertToNew();
            }
            else if (tracked.IsDeleted)
            {
                tracked.ConvertToPossiblyModified();
            }
            else if (tracked.IsRemoved)
            {
                tracked.ConvertToNew();
            }
            else if (!tracked.IsNew)
            {
                throw Error.CantAddAlreadyExistingItem();
            }
        }