diff --git a/src/NHibernate.Test/DialectTest/SchemaTests/DialectNotSupportingNullInUnique.cs b/src/NHibernate.Test/DialectTest/SchemaTests/DialectNotSupportingNullInUnique.cs index fb94109c222..1ca94eb54e0 100644 --- a/src/NHibernate.Test/DialectTest/SchemaTests/DialectNotSupportingNullInUnique.cs +++ b/src/NHibernate.Test/DialectTest/SchemaTests/DialectNotSupportingNullInUnique.cs @@ -29,6 +29,7 @@ protected HbmMapping GetMappings() m.UniqueKey("Test"); }); rc.Property(x => x.Name2, m => m.UniqueKey("Test")); + rc.ManyToOne(e => e.Parent, m => { m.PropertyRef("Name"); }); }); return mapper.CompileMappingForAllExplicitlyAddedEntities(); @@ -42,7 +43,8 @@ public void ScriptGenerationForDialectNotSupportingNullInUnique() var script = configuration.GenerateSchemaCreationScript(new DialectNotSupportingNullInUnique()); - Assert.That(script, Has.None.Contains("unique")); + Assert.That(script, Has.None.Match(@".*\bunique\b.*").IgnoreCase); + Assert.That(script, Has.None.Match(@".*\bforeign key\b.*").IgnoreCase); } } } diff --git a/src/NHibernate.Test/DialectTest/SchemaTests/Entity.cs b/src/NHibernate.Test/DialectTest/SchemaTests/Entity.cs index 633dd5264e9..bba139b0881 100644 --- a/src/NHibernate.Test/DialectTest/SchemaTests/Entity.cs +++ b/src/NHibernate.Test/DialectTest/SchemaTests/Entity.cs @@ -8,5 +8,6 @@ public class Entity public virtual string Name { get; set; } public virtual string Name1 { get; set; } public virtual string Name2 { get; set; } + public virtual Entity Parent { get; set; } } } diff --git a/src/NHibernate/Cfg/Configuration.cs b/src/NHibernate/Cfg/Configuration.cs index 79a668aa881..6b70fa340a2 100644 --- a/src/NHibernate/Cfg/Configuration.cs +++ b/src/NHibernate/Cfg/Configuration.cs @@ -851,7 +851,7 @@ public string[] GenerateDropSchemaScript(Dialect.Dialect dialect) { foreach (var fk in table.ForeignKeyIterator) { - if (fk.HasPhysicalConstraint && IncludeAction(fk.ReferencedTable.SchemaActions, SchemaAction.Drop)) + if (fk.IsGenerated(dialect) && IncludeAction(fk.ReferencedTable.SchemaActions, SchemaAction.Drop)) { script.Add(fk.SqlDropString(dialect, defaultCatalog, defaultSchema)); } @@ -939,7 +939,7 @@ public string[] GenerateSchemaCreationScript(Dialect.Dialect dialect) { foreach (var fk in table.ForeignKeyIterator) { - if (fk.HasPhysicalConstraint && IncludeAction(fk.ReferencedTable.SchemaActions, SchemaAction.Export)) + if (fk.IsGenerated(dialect) && IncludeAction(fk.ReferencedTable.SchemaActions, SchemaAction.Export)) { script.Add(fk.SqlCreateString(dialect, mapping, defaultCatalog, defaultSchema)); } @@ -2344,7 +2344,7 @@ public string[] GenerateSchemaUpdateScript(Dialect.Dialect dialect, IDatabaseMet { foreach (var fk in table.ForeignKeyIterator) { - if (fk.HasPhysicalConstraint && IncludeAction(fk.ReferencedTable.SchemaActions, SchemaAction.Update)) + if (fk.IsGenerated(dialect) && IncludeAction(fk.ReferencedTable.SchemaActions, SchemaAction.Update)) { bool create = tableInfo == null || diff --git a/src/NHibernate/Mapping/ForeignKey.cs b/src/NHibernate/Mapping/ForeignKey.cs index 3737bf1b212..3e6a8ca820f 100644 --- a/src/NHibernate/Mapping/ForeignKey.cs +++ b/src/NHibernate/Mapping/ForeignKey.cs @@ -234,5 +234,20 @@ public bool IsReferenceToPrimaryKey } public string GeneratedConstraintNamePrefix => "FK_"; + + public override bool IsGenerated(Dialect.Dialect dialect) + { + if (!HasPhysicalConstraint) + return false; + if (dialect.SupportsNullInUnique || IsReferenceToPrimaryKey) + return true; + + foreach (var column in ReferencedColumns) + { + if (column.IsNullable) + return false; + } + return true; + } } } diff --git a/src/NHibernate/Mapping/Table.cs b/src/NHibernate/Mapping/Table.cs index 41643237fe2..625b4aa056e 100644 --- a/src/NHibernate/Mapping/Table.cs +++ b/src/NHibernate/Mapping/Table.cs @@ -453,7 +453,7 @@ public string SqlCreateString(Dialect.Dialect dialect, IMapping p, string defaul { foreach (ForeignKey foreignKey in ForeignKeyIterator) { - if (foreignKey.HasPhysicalConstraint) + if (foreignKey.IsGenerated(dialect)) { buf.Append(",").Append(foreignKey.SqlConstraintString(dialect, foreignKey.Name, defaultCatalog, defaultSchema)); }