22using System . Text ;
33using NHibernate . Util ;
44using System ;
5+ using System . Linq ;
56
67namespace NHibernate . Mapping
78{
@@ -14,7 +15,7 @@ public class ForeignKey : Constraint
1415 private Table referencedTable ;
1516 private string referencedEntityName ;
1617 private bool cascadeDeleteEnabled ;
17- private readonly List < Column > referencedColumns = new List < Column > ( ) ;
18+ private List < Column > referencedColumns ;
1819
1920 /// <summary>
2021 /// Generates the SQL string to create the named Foreign Key Constraint in the database.
@@ -35,7 +36,7 @@ public override string SqlConstraintString(Dialect.Dialect d, string constraintN
3536 if ( IsReferenceToPrimaryKey )
3637 refiter = referencedTable . PrimaryKey . ColumnIterator ;
3738 else
38- refiter = referencedColumns ;
39+ refiter = referencedColumns ?? Enumerable . Empty < Column > ( ) ;
3940 foreach ( Column column in ColumnIterator )
4041 {
4142 cols [ i ] = column . GetQuotedName ( d ) ;
@@ -172,13 +173,14 @@ public virtual void AddReferencedColumns(IEnumerable<Column> referencedColumnsIt
172173
173174 private void AddReferencedColumn ( Column column )
174175 {
176+ referencedColumns ??= new List < Column > ( 1 ) ;
175177 if ( ! referencedColumns . Contains ( column ) )
176178 referencedColumns . Add ( column ) ;
177179 }
178180
179181 internal void AddReferencedTable ( PersistentClass referencedClass )
180182 {
181- if ( referencedColumns . Count > 0 )
183+ if ( referencedColumns != null && referencedColumns . Count > 0 )
182184 {
183185 referencedTable = referencedColumns [ 0 ] . Value . Table ;
184186 }
@@ -199,7 +201,7 @@ public override string ToString()
199201 . Append ( string . Join ( ", " , Columns ) )
200202 . Append ( " ref-columns:" )
201203 . Append ( '(' )
202- . Append ( string . Join ( ", " , ReferencedColumns ) )
204+ . Append ( string . Join ( ", " , ReferencedColumnsReadOnly ) )
203205 . Append ( ") as " )
204206 . Append ( Name ) ;
205207 return result . ToString ( ) ;
@@ -218,7 +220,16 @@ public bool HasPhysicalConstraint
218220
219221 public IList < Column > ReferencedColumns
220222 {
221- get { return referencedColumns ; }
223+ get
224+ {
225+ referencedColumns ??= new List < Column > ( 1 ) ;
226+ return referencedColumns ;
227+ }
228+ }
229+
230+ private IEnumerable < Column > ReferencedColumnsReadOnly
231+ {
232+ get { return referencedColumns ?? Enumerable . Empty < Column > ( ) ; }
222233 }
223234
224235 public string ReferencedEntityName
@@ -230,7 +241,7 @@ public string ReferencedEntityName
230241 /// <summary>Does this foreignkey reference the primary key of the reference table </summary>
231242 public bool IsReferenceToPrimaryKey
232243 {
233- get { return referencedColumns . Count == 0 ; }
244+ get { return referencedColumns == null || referencedColumns . Count == 0 ; }
234245 }
235246
236247 public string GeneratedConstraintNamePrefix => "FK_" ;
@@ -242,7 +253,7 @@ public override bool IsGenerated(Dialect.Dialect dialect)
242253 if ( dialect . SupportsNullInUnique || IsReferenceToPrimaryKey )
243254 return true ;
244255
245- foreach ( var column in ReferencedColumns )
256+ foreach ( var column in ReferencedColumnsReadOnly )
246257 {
247258 if ( column . IsNullable )
248259 return false ;
0 commit comments