public void Configure_should_update_table_name_when_base_type_is_null() { var entityMappingConfiguration = new EntityMappingConfiguration { TableName = new DatabaseName("Foo") }; var entityTypeMapping = new DbEntityTypeMapping { EntityType = new EdmEntityType() }; var table = new DbTableMetadata { Name = "foo" }; entityTypeMapping.TypeMappingFragments.Add( new DbEntityTypeMappingFragment { Table = table }); var databaseMapping = new DbDatabaseMapping().Initialize(new EdmModel().Initialize(), new DbDatabaseMetadata().Initialize()); databaseMapping.Database.AddTable("foo"); entityMappingConfiguration.Configure( databaseMapping, ProviderRegistry.Sql2008_ProviderManifest, entityTypeMapping.EntityType, ref entityTypeMapping, false, 0, 1); Assert.Equal("Foo", table.GetTableName().Name); }
public void Apply_should_ignored_configured_tables() { var database = new DbDatabaseMetadata().Initialize(); var table = new DbTableMetadata { DatabaseIdentifier = "Customer" }; table.SetTableName(new DatabaseName("Foo")); database.Schemas.Single().Tables.Add(table); ((IDbConvention<DbTableMetadata>)new PluralizingTableNameConvention()).Apply(table, database); Assert.Equal("Customer", table.DatabaseIdentifier); Assert.Equal("Foo", table.GetTableName().Name); }
private static bool UpdateColumnNamesForTableSharing( DbDatabaseMapping databaseMapping, EdmEntityType entityType, DbTableMetadata toTable, DbEntityTypeMappingFragment fragment) { // Validate: this table can be used only if: // 1. The table is not used by any other type // 2. The table is used only by types in the same type hierarchy (TPH) // 3. There is a 1:1 relationship and the PK count and types match (Table Splitting) var typesSharingTable = FindAllTypesUsingTable(databaseMapping, toTable); var associationsToSharedTable = new Dictionary<EdmEntityType, List<EdmAssociationType>>(); foreach (var candidateType in typesSharingTable) { var oneToOneAssocations = FindAllOneToOneFKAssociationTypes( databaseMapping.Model, entityType, candidateType); var rootType = candidateType.GetRootType(); if (!associationsToSharedTable.ContainsKey(rootType)) { associationsToSharedTable.Add(rootType, oneToOneAssocations.ToList()); } else { associationsToSharedTable[rootType].AddRange(oneToOneAssocations); } } foreach (var candidateTypePair in associationsToSharedTable) { // Check if these types are in a TPH hierarchy if (candidateTypePair.Key != entityType.GetRootType() && candidateTypePair.Value.Count == 0) { var tableName = toTable.GetTableName(); throw Error.EntityMappingConfiguration_InvalidTableSharing( entityType.Name, candidateTypePair.Key.Name, tableName != null ? tableName.Name : toTable.DatabaseIdentifier); } } var allAssociations = associationsToSharedTable.Values.SelectMany(l => l); if (allAssociations.Any()) { var principalKeyNamesType = toTable.GetKeyNamesType(); if (principalKeyNamesType == null) { // grab a candidate var association = allAssociations.First(); principalKeyNamesType = association.Constraint.PrincipalEnd(association).EntityType; if (allAssociations.All(x => x.Constraint.PrincipalEnd(x).EntityType == principalKeyNamesType)) { toTable.SetKeyNamesType(principalKeyNamesType); } } // rename the columns in the fragment to match the principal keys var principalKeys = principalKeyNamesType.KeyProperties().ToArray(); var i = 0; foreach (var k in entityType.KeyProperties()) { var dependentColumn = fragment.PropertyMappings.Single(pm => pm.PropertyPath.First() == k).Column; dependentColumn.Name = principalKeys[i].Name; i++; } return true; } return false; }
private static void ConfigureTable( DbDatabaseMetadata database, DbSchemaMetadata containingSchema, DbTableMetadata table) { //Contract.Requires(database != null); //Contract.Requires(containingSchema != null); //Contract.Requires(table != null); var tableName = table.GetTableName(); if (tableName == null) { return; } if (!string.IsNullOrWhiteSpace(tableName.Schema) && !string.Equals(containingSchema.Name, tableName.Schema, StringComparison.Ordinal)) { containingSchema = database.Schemas .SingleOrDefault(s => string.Equals(s.Name, tableName.Schema, StringComparison.Ordinal)); if (containingSchema == null) { database.Schemas.Add( containingSchema = new DbSchemaMetadata { Name = tableName.Schema, DatabaseIdentifier = tableName.Schema }); } database.RemoveTable(table); containingSchema.Tables.Add(table); } if (!string.Equals(table.DatabaseIdentifier, tableName.Name, StringComparison.Ordinal)) { table.DatabaseIdentifier = tableName.Name; } }