public void AddEntityTypeMappingFragment(
            EdmEntitySet entitySet, EdmEntityType entityType, DbEntityTypeMappingFragment fragment)
        {
            Contract.Assert(fragment.Table == Table);

            _entityTypes.Add(entitySet, entityType);

            var defaultDiscriminatorColumn = fragment.GetDefaultDiscriminator();
            DbColumnCondition defaultDiscriminatorCondition = null;
            if (defaultDiscriminatorColumn != null)
            {
                defaultDiscriminatorCondition =
                    fragment.ColumnConditions.SingleOrDefault(cc => cc.Column == defaultDiscriminatorColumn);
            }

            foreach (var pm in fragment.PropertyMappings)
            {
                var columnMapping = FindOrCreateColumnMapping(pm.Column);
                columnMapping.AddMapping(
                    entityType,
                    pm.PropertyPath,
                    fragment.ColumnConditions.Where(cc => cc.Column == pm.Column),
                    defaultDiscriminatorColumn == pm.Column);
            }

            // Add any column conditions that aren't mapped to properties
            foreach (
                var cc in
                    fragment.ColumnConditions.Where(cc => !fragment.PropertyMappings.Any(pm => pm.Column == cc.Column)))
            {
                var columnMapping = FindOrCreateColumnMapping(cc.Column);
                columnMapping.AddMapping(entityType, null, new[] { cc }, defaultDiscriminatorColumn == cc.Column);
            }
        }
 private static DbEntityTypeMappingFragment FindConditionTypeMappingFragment(
     TableMapping tableMapping, DbEntityTypeMappingFragment propertiesTypeMappingFragment,
     DbEntityTypeMapping conditionTypeMapping)
 {
     var conditionTypeMappingFragment =
         conditionTypeMapping.TypeMappingFragments.SingleOrDefault(x => x.Table == tableMapping.Table);
     if (conditionTypeMappingFragment == null)
     {
         conditionTypeMappingFragment = EntityMappingOperations.CreateTypeMappingFragment(
             conditionTypeMapping, propertiesTypeMappingFragment, tableMapping.Table);
         conditionTypeMappingFragment.SetIsConditionOnlyFragment(true);
         if (propertiesTypeMappingFragment.GetDefaultDiscriminator() != null)
         {
             conditionTypeMappingFragment.SetDefaultDiscriminator(
                 propertiesTypeMappingFragment.GetDefaultDiscriminator());
             propertiesTypeMappingFragment.RemoveDefaultDiscriminatorAnnotation();
         }
     }
     return conditionTypeMappingFragment;
 }
        private void RemoveFragment(
            EdmEntitySet entitySet, DbEntityTypeMapping entityTypeMapping, DbEntityTypeMappingFragment fragment)
        {
            // Make the default discriminator nullable if this type isn't using it but there is a base type
            var defaultDiscriminator = fragment.GetDefaultDiscriminator();
            if (defaultDiscriminator != null
                && entityTypeMapping.EntityType.BaseType != null)
            {
                var columnMapping =
                    _tableMappings[fragment.Table].ColumnMappings.SingleOrDefault(
                        cm => cm.Column == defaultDiscriminator);
                if (columnMapping != null)
                {
                    var propertyMapping = columnMapping.PropertyMappings.SingleOrDefault(
                        pm => pm.EntityType == entityTypeMapping.EntityType);
                    if (propertyMapping != null)
                    {
                        columnMapping.PropertyMappings.Remove(propertyMapping);
                    }
                }
                defaultDiscriminator.IsNullable = true;
            }

            entityTypeMapping.TypeMappingFragments.Remove(fragment);
            if (!entityTypeMapping.TypeMappingFragments.Any())
            {
                _databaseMapping.GetEntitySetMapping(entitySet).EntityTypeMappings.Remove(entityTypeMapping);
            }
        }
 private static void MoveDefaultDiscriminator(
     DbEntityTypeMappingFragment fromFragment, DbEntityTypeMappingFragment toFragment)
 {
     var discriminatorColumn = fromFragment.GetDefaultDiscriminator();
     if (discriminatorColumn != null)
     {
         var discriminator = fromFragment.ColumnConditions.SingleOrDefault(
             cc => cc.Column == discriminatorColumn);
         if (discriminator != null)
         {
             fromFragment.RemoveDefaultDiscriminatorAnnotation();
             fromFragment.ColumnConditions.Remove(discriminator);
             toFragment.AddDiscriminatorCondition(discriminator.Column, discriminator.Value);
             toFragment.SetDefaultDiscriminator(discriminator.Column);
         }
     }
 }