public void AddEntityTypeMappingFragment( EntitySet entitySet, EntityType entityType, MappingFragment fragment) { Debug.Assert(fragment.Table == Table); _entityTypes.Add(entitySet, entityType); var defaultDiscriminatorColumn = fragment.GetDefaultDiscriminator(); foreach (var cm in fragment.ColumnMappings) { var columnMapping = FindOrCreateColumnMapping(cm.ColumnProperty); columnMapping.AddMapping( entityType, cm.PropertyPath, fragment.ColumnConditions.Where(cc => cc.Column == cm.ColumnProperty), defaultDiscriminatorColumn == cm.ColumnProperty); } // Add any column conditions that aren't mapped to properties foreach ( var cc in fragment.ColumnConditions.Where(cc => fragment.ColumnMappings.All(pm => pm.ColumnProperty != cc.Column))) { var columnMapping = FindOrCreateColumnMapping(cc.Column); columnMapping.AddMapping(entityType, null, new[] { cc }, defaultDiscriminatorColumn == cc.Column); } }
private void RemoveFragment( EntitySet entitySet, EntityTypeMapping entityTypeMapping, MappingFragment 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 && !entityTypeMapping.EntityType.Abstract) { 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.Nullable = true; } // The default TPH mapping may result in columns being created that are no longer required // when an abstract type mapping to the table is removed, for example in TPC cases. We need // to remove these columns. if (entityTypeMapping.EntityType.Abstract) { foreach (var columnMapping in _tableMappings[fragment.Table].ColumnMappings.Where( cm => cm.PropertyMappings.All(pm => pm.EntityType == entityTypeMapping.EntityType))) { fragment.Table.RemoveMember(columnMapping.Column); } } entityTypeMapping.RemoveFragment(fragment); if (!entityTypeMapping.MappingFragments.Any()) { _databaseMapping.GetEntitySetMapping(entitySet).RemoveTypeMapping(entityTypeMapping); } }
private static MappingFragment FindConditionTypeMappingFragment( EntitySet tableSet, MappingFragment propertiesTypeMappingFragment, EntityTypeMapping conditionTypeMapping) { var table = tableSet.ElementType; var conditionTypeMappingFragment = conditionTypeMapping.MappingFragments .SingleOrDefault(x => x.Table == table); if (conditionTypeMappingFragment == null) { conditionTypeMappingFragment = EntityMappingOperations .CreateTypeMappingFragment(conditionTypeMapping, propertiesTypeMappingFragment, tableSet); conditionTypeMappingFragment.SetIsConditionOnlyFragment(true); if (propertiesTypeMappingFragment.GetDefaultDiscriminator() != null) { conditionTypeMappingFragment.SetDefaultDiscriminator( propertiesTypeMappingFragment.GetDefaultDiscriminator()); propertiesTypeMappingFragment.RemoveDefaultDiscriminatorAnnotation(); } } return conditionTypeMappingFragment; }