public void Configure_should_preserve_the_most_derived_configuration() { var configurationA = CreateConfiguration(); configurationA.ConcurrencyMode = ConcurrencyMode.Fixed; var configurationB = new Properties.Primitive.PrimitivePropertyConfiguration(); configurationB.IsNullable = false; var property = EdmProperty.Primitive("P", PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.String)); Assert.Null(property.GetConfiguration()); configurationA.Configure(property); Assert.Equal( ConcurrencyMode.Fixed, ((Properties.Primitive.PrimitivePropertyConfiguration)property.GetConfiguration()).ConcurrencyMode); configurationB.Configure(property); Assert.Equal( ConcurrencyMode.Fixed, ((Properties.Primitive.PrimitivePropertyConfiguration)property.GetConfiguration()).ConcurrencyMode); Assert.Equal(false, ((Properties.Primitive.PrimitivePropertyConfiguration)property.GetConfiguration()).IsNullable); Assert.Equal(GetConfigurationType(), property.GetConfiguration().GetType()); }
internal void Configure( DbDatabaseMapping databaseMapping, MappingFragment fragment, EntityType entityType) { DebugCheck.NotNull(fragment); var edmPropertyPath = EntityMappingConfiguration.PropertyPathToEdmPropertyPath(PropertyPath, entityType); if (edmPropertyPath.Count() > 1) { throw Error.InvalidNotNullCondition(PropertyPath.ToString(), entityType.Name); } var column = fragment.ColumnMappings .Where(pm => pm.PropertyPath.SequenceEqual(edmPropertyPath.Single())) .Select(pm => pm.ColumnProperty) .SingleOrDefault(); if (column == null || !fragment.Table.Properties.Contains(column)) { throw Error.InvalidNotNullCondition(PropertyPath.ToString(), entityType.Name); } if (ValueConditionConfiguration.AnyBaseTypeToTableWithoutColumnCondition( databaseMapping, entityType, fragment.Table, column)) { column.Nullable = true; } // Make the property required var newConfiguration = new Properties.Primitive.PrimitivePropertyConfiguration { IsNullable = false, OverridableConfigurationParts = OverridableConfigurationParts.OverridableInSSpace }; newConfiguration.Configure(edmPropertyPath.Single().Last()); fragment.AddNullabilityCondition(column, isNull: false); }
private static void Configure( string structuralTypeName, IEnumerable <EdmProperty> properties, IEnumerable <PropertyInfo> propertyPath, System.Data.Entity.ModelConfiguration.Configuration.Properties.Primitive.PrimitivePropertyConfiguration propertyConfiguration) { EdmProperty property = properties.SingleOrDefault <EdmProperty>((Func <EdmProperty, bool>)(p => p.GetClrPropertyInfo().IsSameAs(propertyPath.First <PropertyInfo>()))); if (property == null) { throw Error.PropertyNotFound((object)propertyPath.First <PropertyInfo>().Name, (object)structuralTypeName); } if (property.IsUnderlyingPrimitiveType) { propertyConfiguration.Configure(property); } else { StructuralTypeConfiguration.Configure(property.ComplexType.Name, (IEnumerable <EdmProperty>)property.ComplexType.Properties, (IEnumerable <PropertyInfo>) new PropertyPath(propertyPath.Skip <PropertyInfo>(1)), propertyConfiguration); } }
internal void Configure( DbDatabaseMapping databaseMapping, StorageMappingFragment fragment, EntityType entityType, DbProviderManifest providerManifest) { DebugCheck.NotNull(fragment); DebugCheck.NotNull(providerManifest); var discriminatorColumn = fragment.Table.Properties .SingleOrDefault(c => string.Equals(c.Name, Discriminator, StringComparison.Ordinal)); if (discriminatorColumn == null) { var typeUsage = providerManifest.GetStoreType(DatabaseMappingGenerator.DiscriminatorTypeUsage); discriminatorColumn = new EdmProperty(Discriminator, typeUsage) { Nullable = false }; TablePrimitiveOperations.AddColumn(fragment.Table, discriminatorColumn); } if (AnyBaseTypeToTableWithoutColumnCondition( databaseMapping, entityType, fragment.Table, discriminatorColumn)) { discriminatorColumn.Nullable = true; } var existingConfiguration = discriminatorColumn.GetConfiguration() as Properties.Primitive.PrimitivePropertyConfiguration; if (Value != null) { ConfigureColumnType(providerManifest, existingConfiguration, discriminatorColumn); fragment.AddDiscriminatorCondition(discriminatorColumn, Value); } else { if (string.IsNullOrWhiteSpace(discriminatorColumn.TypeName)) { var typeUsage = providerManifest.GetStoreType(DatabaseMappingGenerator.DiscriminatorTypeUsage); discriminatorColumn.PrimitiveType = (PrimitiveType)typeUsage.EdmType; discriminatorColumn.MaxLength = DatabaseMappingGenerator.DiscriminatorMaxLength; discriminatorColumn.Nullable = false; } GetOrCreateConfiguration <Properties.Primitive.PrimitivePropertyConfiguration>().IsNullable = true; fragment.AddNullabilityCondition(discriminatorColumn, true); } if (_configuration == null) { return; } if (existingConfiguration != null) { string errorMessage; if ((existingConfiguration.OverridableConfigurationParts & OverridableConfigurationParts.OverridableInCSpace) != OverridableConfigurationParts.OverridableInCSpace && !existingConfiguration.IsCompatible( _configuration, inCSpace: true, errorMessage: out errorMessage)) { throw Error.ConflictingColumnConfiguration(discriminatorColumn, fragment.Table, errorMessage); } } if (_configuration.IsNullable != null) { discriminatorColumn.Nullable = _configuration.IsNullable.Value; } _configuration.Configure(discriminatorColumn, fragment.Table, providerManifest); }