diff --git a/src/EntityFrameworkCore.Generator.Core/ModelGenerator.cs b/src/EntityFrameworkCore.Generator.Core/ModelGenerator.cs index cf922a3..12aeb2a 100644 --- a/src/EntityFrameworkCore.Generator.Core/ModelGenerator.cs +++ b/src/EntityFrameworkCore.Generator.Core/ModelGenerator.cs @@ -311,7 +311,7 @@ private void CreateProperties(Entity entity, DatabaseTable tableSchema) private void CreateRelationships(EntityContext entityContext, Entity entity, DatabaseTable tableSchema) { - foreach (var foreignKey in tableSchema.ForeignKeys) + foreach (var foreignKey in tableSchema.ForeignKeys.OrderBy(fk => fk.Name)) { // skip relationship if principal table is ignored if (IsIgnored(foreignKey.PrincipalTable, _options.Database.Exclude.Tables)) @@ -320,6 +320,12 @@ private void CreateRelationships(EntityContext entityContext, Entity entity, Dat continue; } + if (IsIgnored(foreignKey, _options.Database.Exclude.Relationships)) + { + _logger.LogDebug(" Skipping Relationship : {name}", foreignKey.Name); + continue; + } + CreateRelationship(entityContext, entity, foreignKey); } @@ -748,6 +754,16 @@ private static bool IsIgnored(DatabaseColumn column, IEnumerable e return IsIgnored(name, excludeExpressions, includeExpressions); } + private static bool IsIgnored(DatabaseForeignKey relationship, IEnumerable exclude) + { + var table = relationship.Table; + var name = $"{table.Schema}.{table.Name}.{relationship.Name}"; + var includeExpressions = Enumerable.Empty(); + var excludeExpressions = exclude ?? []; + + return IsIgnored(name, excludeExpressions, includeExpressions); + } + private static bool IsIgnored(Property property, TOption options, SharedModelOptions sharedOptions) where TOption : ModelOptionsBase { diff --git a/src/EntityFrameworkCore.Generator.Core/OptionMapper.cs b/src/EntityFrameworkCore.Generator.Core/OptionMapper.cs index b38b2bb..6194f3f 100644 --- a/src/EntityFrameworkCore.Generator.Core/OptionMapper.cs +++ b/src/EntityFrameworkCore.Generator.Core/OptionMapper.cs @@ -216,6 +216,12 @@ private static void MapDatabaseMatch(DatabaseMatchOptions option, DatabaseMatchM var prefix = OptionsBase.AppendPrefix(option.Prefix, $"Column{option.Columns?.Count:0000}"); return MapMatch(option.Variables, match, prefix); }); + + MapList(option.Relationships, match.Relationships, (match) => + { + var prefix = OptionsBase.AppendPrefix(option.Prefix, $"Relationship{option.Relationships?.Count:0000}"); + return MapMatch(option.Variables, match, prefix); + }); } private static void MapList(IList targetList, IList? sourceList) diff --git a/src/EntityFrameworkCore.Generator.Core/Options/DatabaseMatchOptions.cs b/src/EntityFrameworkCore.Generator.Core/Options/DatabaseMatchOptions.cs index 1aaf3cb..ffd4070 100644 --- a/src/EntityFrameworkCore.Generator.Core/Options/DatabaseMatchOptions.cs +++ b/src/EntityFrameworkCore.Generator.Core/Options/DatabaseMatchOptions.cs @@ -17,6 +17,7 @@ public DatabaseMatchOptions(VariableDictionary variables, string? prefix) { Tables = []; Columns = []; + Relationships = []; } /// @@ -34,4 +35,12 @@ public DatabaseMatchOptions(VariableDictionary variables, string? prefix) /// The list of regular expression of columns to ignore. /// public List Columns { get; set; } + + /// + /// Gets or sets a list of regular expression of relationships to ignore. + /// + /// + /// The list of regular expression of relationships to ignore. + /// + public List Relationships { get; set; } } diff --git a/src/EntityFrameworkCore.Generator.Core/Serialization/DatabaseMatchModel.cs b/src/EntityFrameworkCore.Generator.Core/Serialization/DatabaseMatchModel.cs index 6ca2552..403866d 100644 --- a/src/EntityFrameworkCore.Generator.Core/Serialization/DatabaseMatchModel.cs +++ b/src/EntityFrameworkCore.Generator.Core/Serialization/DatabaseMatchModel.cs @@ -20,4 +20,12 @@ public class DatabaseMatchModel /// The list of regular expression of columns to ignore. /// public List? Columns { get; set; } + + /// + /// Gets or sets a list of regular expression of relationships to ignore. + /// + /// + /// The list of regular expression of relationships to ignore. + /// + public List? Relationships { get; set; } }