/// <summary>
        ///     Creates a new EntityTypeMapping in the existing EntitySetMapping
        ///     based on another EntityTypeMapping (etmToClone) in a different artifact.
        ///     All the other parameters are presumed to already exist in the same artifact
        ///     as the EntitySetMapping.
        /// </summary>
        internal static EntityTypeMapping CloneEntityTypeMapping(
            CommandProcessorContext cpc,
            EntityTypeMapping etmToClone, EntitySetMapping existingEntitySetMapping,
            ConceptualEntityType existingEntityType, EntityTypeMappingKind kind)
        {
            var createETM = new CreateEntityTypeMappingCommand(existingEntitySetMapping, existingEntityType, kind);
            var cp        = new CommandProcessor(cpc, createETM);

            cp.Invoke();

            var etm = createETM.EntityTypeMapping;

            foreach (var mappingFragment in etmToClone.MappingFragments())
            {
                var sesToClone = mappingFragment.StoreEntitySet.Target as StorageEntitySet;
                var ses        = existingEntitySetMapping.EntityContainerMapping.Artifact.
                                 StorageModel().FirstEntityContainer.GetFirstNamedChildByLocalName(sesToClone.LocalName.Value)
                                 as StorageEntitySet;
                CreateMappingFragmentCommand.CloneMappingFragment(cpc, mappingFragment, etm, ses);
            }

            return(etm);
        }
        private void ProcessEntityTypeMapping(EntityInfo info, EntityTypeMappingKind kind)
        {
            var etm = ModelHelper.FindEntityTypeMapping(_cpc, info.EntityType, kind, false);

            if (info.UsesEntityTypeMappingKind(kind))
            {
                // find or create the entity type mapping
                if (etm == null)
                {
                    var createETM = new CreateEntityTypeMappingCommand(
                        _entitySetMapping,
                        info.EntityType,
                        kind);
                    CommandProcessor.InvokeSingleCommand(_cpc, createETM);
                    etm = createETM.EntityTypeMapping;
                }
                Debug.Assert(etm != null, "Could not locate or create the required EntityTypeMapping");

                ProcessMappingFragments(info, etm);
            }
            else
            {
                // don't need it, remove it if we have one
                if (etm != null)
                {
                    AddToDeleteList(etm);
                }
            }
        }
        /// <summary>
        ///     Creates a new EntityTypeMapping in the existing EntitySetMapping
        ///     based on another EntityTypeMapping (etmToClone) in a different artifact.
        ///     All the other parameters are presumed to already exist in the same artifact
        ///     as the EntitySetMapping.
        /// </summary>
        internal static EntityTypeMapping CloneEntityTypeMapping(
            CommandProcessorContext cpc,
            EntityTypeMapping etmToClone, EntitySetMapping existingEntitySetMapping,
            ConceptualEntityType existingEntityType, EntityTypeMappingKind kind)
        {
            var createETM = new CreateEntityTypeMappingCommand(existingEntitySetMapping, existingEntityType, kind);
            var cp = new CommandProcessor(cpc, createETM);
            cp.Invoke();

            var etm = createETM.EntityTypeMapping;

            foreach (var mappingFragment in etmToClone.MappingFragments())
            {
                var sesToClone = mappingFragment.StoreEntitySet.Target as StorageEntitySet;
                var ses = existingEntitySetMapping.EntityContainerMapping.Artifact.
                              StorageModel().FirstEntityContainer.GetFirstNamedChildByLocalName(sesToClone.LocalName.Value)
                          as StorageEntitySet;
                CreateMappingFragmentCommand.CloneMappingFragment(cpc, mappingFragment, etm, ses);
            }

            return etm;
        }