From e840d5b415995639a91bcabbd0dbb71d4e39cc42 Mon Sep 17 00:00:00 2001 From: Carlos Galan Date: Thu, 31 Jan 2019 16:42:25 -0600 Subject: [PATCH 1/2] This improve the handling of identification of mapping tables when include composite keys --- .../EF.Reverse.POCO.Core.ttinclude | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/EntityFramework.Reverse.POCO.Generator/EF.Reverse.POCO.Core.ttinclude b/EntityFramework.Reverse.POCO.Generator/EF.Reverse.POCO.Core.ttinclude index 284fafc3..a491e2e8 100644 --- a/EntityFramework.Reverse.POCO.Generator/EF.Reverse.POCO.Core.ttinclude +++ b/EntityFramework.Reverse.POCO.Generator/EF.Reverse.POCO.Core.ttinclude @@ -4113,14 +4113,22 @@ SELECT SERVERPROPERTY('Edition') AS Edition, } } - public void AddMappingConfiguration(ForeignKey left, ForeignKey right, string leftPropName, string rightPropName) + public void AddMappingConfiguration(ForeignKey left, ForeignKey right, string leftPropName, string rightPropName, List fkList) { + var leftColumnName = GetMapKeyName(fkList, left); + var rightColumnName = GetMapKeyName(fkList, right); MappingConfiguration.Add(string.Format(@"HasMany(t => t.{0}).WithMany(t => t.{1}).Map(m => {{ m.ToTable(""{2}""{5}); m.MapLeftKey(""{3}""); m.MapRightKey(""{4}""); - }});", leftPropName, rightPropName, left.FkTableName, left.FkColumn, right.FkColumn, Settings.IsSqlCe ? string.Empty : ", \"" + left.FkSchema + "\"")); + }});", leftPropName, rightPropName, left.FkTableName, leftColumnName, rightColumnName, Settings.IsSqlCe ? string.Empty : ", \"" + left.FkSchema + "\"")); + } + + public string GetMapKeyName(List fkList, ForeignKey fk) + { + var fks = fkList.FindAll(f => f.ConstraintName == fk.ConstraintName).Select(f => $"\"{f.FkColumn}\"").ToList() as List; + return string.Join(", ", fks); } public void IdentifyMappingTable(List fkList, Tables tables, bool checkForFkNameClashes) @@ -4129,12 +4137,8 @@ SELECT SERVERPROPERTY('Edition') AS Edition, var nonReadOnlyColumns = Columns.Where(c => !c.IsIdentity && !c.IsRowVersion && !c.IsStoreGenerated && !c.Hidden).ToList(); - // Ignoring read-only columns, it must have only 2 columns to be a mapping table - if (nonReadOnlyColumns.Count != 2) - return; - - // Must have 2 primary keys - if (nonReadOnlyColumns.Count(x => x.IsPrimaryKey) != 2) + // In mapping tables between tables with composite keys there are more than 2 columns + if (nonReadOnlyColumns.Count(x => x.IsPrimaryKey) != nonReadOnlyColumns.Count) return; // No columns should be nullable @@ -4148,11 +4152,11 @@ SELECT SERVERPROPERTY('Edition') AS Edition, .ToList(); // Each column must have a foreign key, therefore check column and foreign key counts match - if (foreignKeys.Select(x => x.FkColumn).Distinct().Count() != 2) + if (foreignKeys.Select(x => x.ConstraintName).Distinct().Count() != 2) return; ForeignKey left = foreignKeys[0]; - ForeignKey right = foreignKeys[1]; + ForeignKey right = foreignKeys.Find(f => f.ConstraintName != left.ConstraintName); if (!left.IncludeReverseNavigation || !right.IncludeReverseNavigation) return; @@ -4168,7 +4172,7 @@ SELECT SERVERPROPERTY('Edition') AS Edition, leftPropName = Settings.MappingTableRename(Name, leftTable.NameHumanCase, leftPropName); var rightPropName = rightTable.GetUniqueColumnName(leftTable.NameHumanCase, left, checkForFkNameClashes, false, Relationship.ManyToOne); // relationship from the mapping table to each side is Many-to-One rightPropName = Settings.MappingTableRename(Name, rightTable.NameHumanCase, rightPropName); - leftTable.AddMappingConfiguration(left, right, leftPropName, rightPropName); + leftTable.AddMappingConfiguration(left, right, leftPropName, rightPropName, foreignKeys); IsMapping = true; rightTable.AddReverseNavigation(Relationship.ManyToMany, rightTable.NameHumanCase, leftTable, rightPropName, null, null, this); From 4c84045ad792bd09a7869e01c5708ed8ebbd224b Mon Sep 17 00:00:00 2001 From: Carlos Galan Date: Thu, 31 Jan 2019 17:27:25 -0600 Subject: [PATCH 2/2] Fix quotation marks --- .../EF.Reverse.POCO.Core.ttinclude | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/EntityFramework.Reverse.POCO.Generator/EF.Reverse.POCO.Core.ttinclude b/EntityFramework.Reverse.POCO.Generator/EF.Reverse.POCO.Core.ttinclude index a491e2e8..944879da 100644 --- a/EntityFramework.Reverse.POCO.Generator/EF.Reverse.POCO.Core.ttinclude +++ b/EntityFramework.Reverse.POCO.Generator/EF.Reverse.POCO.Core.ttinclude @@ -4120,8 +4120,8 @@ SELECT SERVERPROPERTY('Edition') AS Edition, MappingConfiguration.Add(string.Format(@"HasMany(t => t.{0}).WithMany(t => t.{1}).Map(m => {{ m.ToTable(""{2}""{5}); - m.MapLeftKey(""{3}""); - m.MapRightKey(""{4}""); + m.MapLeftKey({3}); + m.MapRightKey({4}); }});", leftPropName, rightPropName, left.FkTableName, leftColumnName, rightColumnName, Settings.IsSqlCe ? string.Empty : ", \"" + left.FkSchema + "\"")); }