Skip to content

Commit 8061e2b

Browse files
Do not generate FK on non-generated unique constraint
1 parent 39bf753 commit 8061e2b

File tree

5 files changed

+23
-5
lines changed

5 files changed

+23
-5
lines changed

src/NHibernate.Test/DialectTest/SchemaTests/DialectNotSupportingNullInUnique.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ protected HbmMapping GetMappings()
2929
m.UniqueKey("Test");
3030
});
3131
rc.Property(x => x.Name2, m => m.UniqueKey("Test"));
32+
rc.ManyToOne(e => e.Parent, m => { m.PropertyRef("Name"); });
3233
});
3334

3435
return mapper.CompileMappingForAllExplicitlyAddedEntities();
@@ -42,7 +43,8 @@ public void ScriptGenerationForDialectNotSupportingNullInUnique()
4243

4344
var script = configuration.GenerateSchemaCreationScript(new DialectNotSupportingNullInUnique());
4445

45-
Assert.That(script, Has.None.Contains("unique"));
46+
Assert.That(script, Has.None.Match(@".*\bunique\b.*").IgnoreCase);
47+
Assert.That(script, Has.None.Match(@".*\bforeign key\b.*").IgnoreCase);
4648
}
4749
}
4850
}

src/NHibernate.Test/DialectTest/SchemaTests/Entity.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ public class Entity
88
public virtual string Name { get; set; }
99
public virtual string Name1 { get; set; }
1010
public virtual string Name2 { get; set; }
11+
public virtual Entity Parent { get; set; }
1112
}
1213
}

src/NHibernate/Cfg/Configuration.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -851,7 +851,7 @@ public string[] GenerateDropSchemaScript(Dialect.Dialect dialect)
851851
{
852852
foreach (var fk in table.ForeignKeyIterator)
853853
{
854-
if (fk.HasPhysicalConstraint && IncludeAction(fk.ReferencedTable.SchemaActions, SchemaAction.Drop))
854+
if (fk.IsGenerated(dialect) && IncludeAction(fk.ReferencedTable.SchemaActions, SchemaAction.Drop))
855855
{
856856
script.Add(fk.SqlDropString(dialect, defaultCatalog, defaultSchema));
857857
}
@@ -939,7 +939,7 @@ public string[] GenerateSchemaCreationScript(Dialect.Dialect dialect)
939939
{
940940
foreach (var fk in table.ForeignKeyIterator)
941941
{
942-
if (fk.HasPhysicalConstraint && IncludeAction(fk.ReferencedTable.SchemaActions, SchemaAction.Export))
942+
if (fk.IsGenerated(dialect) && IncludeAction(fk.ReferencedTable.SchemaActions, SchemaAction.Export))
943943
{
944944
script.Add(fk.SqlCreateString(dialect, mapping, defaultCatalog, defaultSchema));
945945
}
@@ -2344,7 +2344,7 @@ public string[] GenerateSchemaUpdateScript(Dialect.Dialect dialect, IDatabaseMet
23442344
{
23452345
foreach (var fk in table.ForeignKeyIterator)
23462346
{
2347-
if (fk.HasPhysicalConstraint && IncludeAction(fk.ReferencedTable.SchemaActions, SchemaAction.Update))
2347+
if (fk.IsGenerated(dialect) && IncludeAction(fk.ReferencedTable.SchemaActions, SchemaAction.Update))
23482348
{
23492349
bool create = tableInfo == null
23502350
||

src/NHibernate/Mapping/ForeignKey.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,5 +234,20 @@ public bool IsReferenceToPrimaryKey
234234
}
235235

236236
public string GeneratedConstraintNamePrefix => "FK_";
237+
238+
public override bool IsGenerated(Dialect.Dialect dialect)
239+
{
240+
if (!HasPhysicalConstraint)
241+
return false;
242+
if (dialect.SupportsNullInUnique || IsReferenceToPrimaryKey)
243+
return true;
244+
245+
foreach (var column in ReferencedColumns)
246+
{
247+
if (column.IsNullable)
248+
return false;
249+
}
250+
return true;
251+
}
237252
}
238253
}

src/NHibernate/Mapping/Table.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,7 @@ public string SqlCreateString(Dialect.Dialect dialect, IMapping p, string defaul
453453
{
454454
foreach (ForeignKey foreignKey in ForeignKeyIterator)
455455
{
456-
if (foreignKey.HasPhysicalConstraint)
456+
if (foreignKey.IsGenerated(dialect))
457457
{
458458
buf.Append(",").Append(foreignKey.SqlConstraintString(dialect, foreignKey.Name, defaultCatalog, defaultSchema));
459459
}

0 commit comments

Comments
 (0)