Skip to content

Commit

Permalink
Tools: Add --no-pluralize option
Browse files Browse the repository at this point in the history
  • Loading branch information
bricelam committed May 14, 2020
1 parent 10cd619 commit 0c3b907
Show file tree
Hide file tree
Showing 18 changed files with 253 additions and 56 deletions.
5 changes: 3 additions & 2 deletions src/EFCore.Design/Design/Internal/DatabaseOperations.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,8 @@ public virtual SavedModelFiles ScaffoldContext(
[CanBeNull] string contextNamespace,
bool useDataAnnotations,
bool overwriteFiles,
bool useDatabaseNames)
bool useDatabaseNames,
bool noPluralize)
{
Check.NotEmpty(provider, nameof(provider));
Check.NotEmpty(connectionString, nameof(connectionString));
Expand Down Expand Up @@ -104,7 +105,7 @@ public virtual SavedModelFiles ScaffoldContext(
var scaffoldedModel = scaffolder.ScaffoldModel(
connectionString,
new DatabaseModelFactoryOptions(tables, schemas),
new ModelReverseEngineerOptions { UseDatabaseNames = useDatabaseNames },
new ModelReverseEngineerOptions { UseDatabaseNames = useDatabaseNames, NoPluralize = noPluralize },
new ModelCodeGenerationOptions
{
UseDataAnnotations = useDataAnnotations,
Expand Down
9 changes: 6 additions & 3 deletions src/EFCore.Design/Design/OperationExecutor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -448,6 +448,7 @@ public class ScaffoldContext : OperationBase
/// <para><c>useDatabaseNames</c>--Use table and column names directly from the database.</para>
/// <para><c>modelNamespace</c>--Specify to override the namespace of the generated entity types.</para>
/// <para><c>contextNamespace</c>--Specify to override the namespace of the generated DbContext class.</para>
/// <para><c>noPluralize</c>--Don't use the pluralizer.</para>
/// </summary>
/// <param name="executor"> The operation executor. </param>
/// <param name="resultHandler"> The <see cref="IOperationResultHandler" />. </param>
Expand All @@ -471,12 +472,13 @@ public ScaffoldContext(
var useDataAnnotations = (bool)args["useDataAnnotations"];
var overwriteFiles = (bool)args["overwriteFiles"];
var useDatabaseNames = (bool)args["useDatabaseNames"];
var noPluralize = (bool)(args["noPluralize"] ?? false);

Execute(
() => executor.ScaffoldContextImpl(
provider, connectionString, outputDir, outputDbContextDir, dbContextClassName,
schemaFilters, tableFilters, modelNamespace, contextNamespace, useDataAnnotations,
overwriteFiles, useDatabaseNames));
overwriteFiles, useDatabaseNames, noPluralize));
}
}

Expand All @@ -492,7 +494,8 @@ private IDictionary ScaffoldContextImpl(
[CanBeNull] string contextNamespace,
bool useDataAnnotations,
bool overwriteFiles,
bool useDatabaseNames)
bool useDatabaseNames,
bool noPluralize)
{
Check.NotNull(provider, nameof(provider));
Check.NotNull(connectionString, nameof(connectionString));
Expand All @@ -502,7 +505,7 @@ private IDictionary ScaffoldContextImpl(
var files = DatabaseOperations.ScaffoldContext(
provider, connectionString, outputDir, outputDbContextDir, dbContextClassName,
schemaFilters, tableFilters, modelNamespace, contextNamespace, useDataAnnotations,
overwriteFiles, useDatabaseNames);
overwriteFiles, useDatabaseNames, noPluralize);

return new Hashtable { ["ContextFile"] = files.ContextFile, ["EntityTypeFiles"] = files.AdditionalFiles.ToArray() };
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,6 @@ public interface IScaffoldingModelFactory
/// any release. You should only use it directly in your code with extreme caution and knowing that
/// doing so can result in application failures when updating to a new Entity Framework Core release.
/// </summary>
IModel Create([NotNull] DatabaseModel databaseModel, bool useDatabaseNames);
IModel Create([NotNull] DatabaseModel databaseModel, bool useDatabaseNames, bool noPluralize);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ public RelationalScaffoldingModelFactory(
/// any release. You should only use it directly in your code with extreme caution and knowing that
/// doing so can result in application failures when updating to a new Entity Framework Core release.
/// </summary>
public virtual IModel Create(DatabaseModel databaseModel, bool useDatabaseNames)
public virtual IModel Create(DatabaseModel databaseModel, bool useDatabaseNames, bool noPluralize)
{
Check.NotNull(databaseModel, nameof(databaseModel));

Expand All @@ -91,21 +91,21 @@ public virtual IModel Create(DatabaseModel databaseModel, bool useDatabaseNames)
? (Func<DatabaseTable, string>)(t => t.Name)
: t => _candidateNamingService.GenerateCandidateIdentifier(t),
_cSharpUtilities,
useDatabaseNames
useDatabaseNames || noPluralize
? (Func<string, string>)null
: _pluralizer.Singularize);
_dbSetNamer = new CSharpUniqueNamer<DatabaseTable>(
useDatabaseNames
? (Func<DatabaseTable, string>)(t => t.Name)
: t => _candidateNamingService.GenerateCandidateIdentifier(t),
_cSharpUtilities,
useDatabaseNames
useDatabaseNames || noPluralize
? (Func<string, string>)null
: _pluralizer.Pluralize);
_columnNamers = new Dictionary<DatabaseTable, CSharpUniqueNamer<DatabaseColumn>>();
_useDatabaseNames = useDatabaseNames;

VisitDatabaseModel(modelBuilder, databaseModel);
VisitDatabaseModel(modelBuilder, databaseModel, noPluralize);

return modelBuilder.Model;
}
Expand Down Expand Up @@ -178,7 +178,7 @@ protected virtual string GetPropertyName([NotNull] DatabaseColumn column)
/// any release. You should only use it directly in your code with extreme caution and knowing that
/// doing so can result in application failures when updating to a new Entity Framework Core release.
/// </summary>
protected virtual ModelBuilder VisitDatabaseModel([NotNull] ModelBuilder modelBuilder, [NotNull] DatabaseModel databaseModel)
protected virtual ModelBuilder VisitDatabaseModel([NotNull] ModelBuilder modelBuilder, [NotNull] DatabaseModel databaseModel, bool noPluralize)
{
Check.NotNull(modelBuilder, nameof(modelBuilder));
Check.NotNull(databaseModel, nameof(databaseModel));
Expand All @@ -195,7 +195,7 @@ protected virtual ModelBuilder VisitDatabaseModel([NotNull] ModelBuilder modelBu

VisitSequences(modelBuilder, databaseModel.Sequences);
VisitTables(modelBuilder, databaseModel.Tables);
VisitForeignKeys(modelBuilder, databaseModel.Tables.SelectMany(table => table.ForeignKeys).ToList());
VisitForeignKeys(modelBuilder, databaseModel.Tables.SelectMany(table => table.ForeignKeys).ToList(), noPluralize);

modelBuilder.Model.AddAnnotations(databaseModel.GetAnnotations());

Expand Down Expand Up @@ -700,7 +700,7 @@ protected virtual IndexBuilder VisitIndex([NotNull] EntityTypeBuilder builder, [
/// doing so can result in application failures when updating to a new Entity Framework Core release.
/// </summary>
protected virtual ModelBuilder VisitForeignKeys(
[NotNull] ModelBuilder modelBuilder, [NotNull] IList<DatabaseForeignKey> foreignKeys)
[NotNull] ModelBuilder modelBuilder, [NotNull] IList<DatabaseForeignKey> foreignKeys, bool noPluralize)
{
Check.NotNull(modelBuilder, nameof(modelBuilder));
Check.NotNull(foreignKeys, nameof(foreignKeys));
Expand All @@ -715,7 +715,7 @@ protected virtual ModelBuilder VisitForeignKeys(
// when there are multiple foreign keys does not work.
foreach (var foreignKey in modelBuilder.Model.GetEntityTypes().SelectMany(et => et.GetForeignKeys()))
{
AddNavigationProperties(foreignKey);
AddNavigationProperties(foreignKey, noPluralize);
}

return modelBuilder;
Expand Down Expand Up @@ -867,7 +867,7 @@ protected virtual IMutableForeignKey VisitForeignKey([NotNull] ModelBuilder mode
/// any release. You should only use it directly in your code with extreme caution and knowing that
/// doing so can result in application failures when updating to a new Entity Framework Core release.
/// </summary>
protected virtual void AddNavigationProperties([NotNull] IMutableForeignKey foreignKey)
protected virtual void AddNavigationProperties([NotNull] IMutableForeignKey foreignKey, bool noPluralize)
{
Check.NotNull(foreignKey, nameof(foreignKey));

Expand Down Expand Up @@ -900,7 +900,9 @@ protected virtual void AddNavigationProperties([NotNull] IMutableForeignKey fore
if (!foreignKey.IsUnique
&& !foreignKey.IsSelfReferencing())
{
principalEndNavigationPropertyCandidateName = _pluralizer.Pluralize(principalEndNavigationPropertyCandidateName);
principalEndNavigationPropertyCandidateName = noPluralize
? principalEndNavigationPropertyCandidateName
: _pluralizer.Pluralize(principalEndNavigationPropertyCandidateName);
}

var principalEndNavigationPropertyName =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ public virtual ScaffoldedModel ScaffoldModel(
databaseModel.RemoveAnnotation(ScaffoldingAnnotationNames.ConnectionString);
}

var model = _factory.Create(databaseModel, modelOptions.UseDatabaseNames);
var model = _factory.Create(databaseModel, modelOptions.UseDatabaseNames, modelOptions.NoPluralize);

if (model == null)
{
Expand Down
6 changes: 6 additions & 0 deletions src/EFCore.Design/Scaffolding/ModelReverseEngineerOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,11 @@ public class ModelReverseEngineerOptions
/// </summary>
/// <value> A value indicating whether to use the database schema names directly. </value>
public virtual bool UseDatabaseNames { get; set; }

/// <summary>
/// Gets or sets a value indicating whether to use the pluralizer.
/// </summary>
/// <value>A value indicating whether to use the pluralizer.</value>
public virtual bool NoPluralize { get; set; }
}
}
6 changes: 5 additions & 1 deletion src/EFCore.Tools/tools/EntityFrameworkCore.PS2.psm1
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,9 @@ function Remove-Migration(
.PARAMETER ContextNamespace
Specify to override the namespace for the DbContext class.
.PARAMETER NoPluralize
Don't use the pluralizer.
.LINK
about_EntityFrameworkCore
#>
Expand All @@ -204,7 +207,8 @@ function Scaffold-DbContext(
$Project,
$StartupProject,
$Namespace,
$ContextNamespace)
$ContextNamespace,
[switch] $NoPluralize)
{
throw $UpdatePowerShell
}
Expand Down
9 changes: 9 additions & 0 deletions src/EFCore.Tools/tools/EntityFrameworkCore.psm1
Original file line number Diff line number Diff line change
Expand Up @@ -371,6 +371,9 @@ Register-TabExpansion Scaffold-DbContext @{
.PARAMETER ContextNamespace
Specify to override the namespace for the DbContext class.
.PARAMETER NoPluralize
Don't use the pluralizer.
.PARAMETER RemainingArguments
Arguments passed to the application.
Expand All @@ -397,6 +400,7 @@ function Scaffold-DbContext
[string] $StartupProject,
[string] $Namespace,
[string] $ContextNamespace,
[switch] $NoPluralize,
[Parameter(ValueFromRemainingArguments = $true)]
[string[]] $RemainingArguments)

Expand Down Expand Up @@ -448,6 +452,11 @@ function Scaffold-DbContext
$params += '--force'
}

if ($NoPluralize)
{
$params += '--no-pluralize'
}

if ($RemainingArguments -ne $null)
{
$params += $RemainingArguments
Expand Down
6 changes: 6 additions & 0 deletions src/dotnet-ef/Properties/Resources.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions src/dotnet-ef/Properties/Resources.resx
Original file line number Diff line number Diff line change
Expand Up @@ -330,4 +330,7 @@
<data name="MigrationsNamespaceDescription" xml:space="preserve">
<value>Specify to override the namespace for the migration.</value>
</data>
<data name="NoPluralizeDescription" xml:space="preserve">
<value>Don't use the pluralizer.</value>
</data>
</root>
2 changes: 2 additions & 0 deletions src/ef/Commands/DbContextScaffoldCommand.Configure.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ internal partial class DbContextScaffoldCommand : ProjectCommandBase
private CommandOption _json;
private CommandOption _namespace;
private CommandOption _contextNamespace;
private CommandOption _noPluralize;

public override void Configure(CommandLineApplication command)
{
Expand All @@ -40,6 +41,7 @@ public override void Configure(CommandLineApplication command)
_json = Json.ConfigureOption(command);
_namespace = command.Option("-n|--namespace <NAMESPACE>", Resources.NamespaceDescription);
_contextNamespace = command.Option("--context-namespace <NAMESPACE>", Resources.ContextNamespaceDescription);
_noPluralize = command.Option("--no-pluralize", Resources.NoPluralizeDescription);

base.Configure(command);
}
Expand Down
3 changes: 2 additions & 1 deletion src/ef/Commands/DbContextScaffoldCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ protected override int Execute(string[] args)
_force.HasValue(),
_useDatabaseNames.HasValue(),
_namespace.Value(),
_contextNamespace.Value());
_contextNamespace.Value(),
_noPluralize.HasValue());
if (_json.HasValue())
{
ReportJsonResults(result);
Expand Down
3 changes: 2 additions & 1 deletion src/ef/IOperationExecutor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@ IDictionary ScaffoldContext(
bool overwriteFiles,
bool useDatabaseNames,
string entityNamespace,
string dbContextNamespace);
string dbContextNamespace,
bool noPluralize);

string ScriptMigration(string fromMigration, string toMigration, bool idempotent, string contextType);

Expand Down
6 changes: 4 additions & 2 deletions src/ef/OperationExecutorBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,8 @@ public IDictionary ScaffoldContext(
bool overwriteFiles,
bool useDatabaseNames,
string modelNamespace,
string contextNamespace)
string contextNamespace,
bool noPluralize)
=> InvokeOperation<IDictionary>(
"ScaffoldContext",
new Dictionary<string, object>
Expand All @@ -159,7 +160,8 @@ public IDictionary ScaffoldContext(
["overwriteFiles"] = overwriteFiles,
["useDatabaseNames"] = useDatabaseNames,
["modelNamespace"] = modelNamespace,
["contextNamespace"] = contextNamespace
["contextNamespace"] = contextNamespace,
["noPluralize"] = noPluralize
});

public string ScriptMigration(
Expand Down
6 changes: 6 additions & 0 deletions src/ef/Properties/Resources.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions src/ef/Properties/Resources.resx
Original file line number Diff line number Diff line change
Expand Up @@ -345,4 +345,7 @@
<data name="RemainingArguments" xml:space="preserve">
<value>Remaining arguments: '{remainingArguments}'.</value>
</data>
<data name="NoPluralizeDescription" xml:space="preserve">
<value>Don't use the pluralizer.</value>
</data>
</root>
Loading

0 comments on commit 0c3b907

Please sign in to comment.