diff --git a/.editorconfig b/.editorconfig index 1468ece..a241d5f 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,40 +1,257 @@ -; Top-most EditorConfig file +# Schema: http://EditorConfig.org +# Docs: https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference + +# top-most EditorConfig file root = true -; Unix-style newlines +# Don't use tabs for indentation. [*] -end_of_line = LF - -; 4-column space indentation -[*.cs] indent_style = space -indent_size = 4 -; trim_trailing_whitespace = true -insert_final_newline = true +trim_trailing_whitespace = true +guidelines = 140 +max_line_length = 140 -[*.cs] -dotnet_style_qualification_for_field = false:error -dotnet_style_qualification_for_property = false:error -dotnet_style_qualification_for_method = false:error -dotnet_style_qualification_for_event = false:error -dotnet_style_predefined_type_for_locals_parameters_members = true:error -dotnet_style_predefined_type_for_member_access = true:error +# Code files +[*.{cs,csx,vb,vbx}] +indent_size = 4 +insert_final_newline = true +#charset = utf-8-bom + +# Xml project files +[*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,projitems,shproj}] +indent_size = 2 + +# Xml config files +[*.{props,targets,ruleset,config,nuspec,resx,vsixmanifest,vsct,xml,stylecop}] +indent_size = 2 + +# JSON files +[*.json] +indent_size = 2 + +# Powershell files +[*.ps1] +indent_size = 2 + +# Shell scripts +[*.sh] +end_of_line = lf +indent_size = 2 + +[*.{cmd,bat}] +end_of_line = crlf +indent_size = 2 + +## Language conventions +# Dotnet code style settings: +[*.{cs,vb}] +# "This." and "Me." qualifiers +dotnet_style_qualification_for_field = false:suggestion +dotnet_style_qualification_for_property = false:suggestion +dotnet_style_qualification_for_method = false:suggestion +dotnet_style_qualification_for_event = false:suggestion + +# Language keywords instead of framework type names for type references +dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion +dotnet_style_predefined_type_for_member_access = true:suggestion + +# Modifier preferences +dotnet_style_require_accessibility_modifiers = always:suggestion +dotnet_style_readonly_field = true:warning + +# Parentheses preferences +dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent + +# Expression-level preferences dotnet_style_object_initializer = true:suggestion dotnet_style_collection_initializer = true:suggestion dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_auto_properties = true:silent +dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion +dotnet_style_prefer_conditional_expression_over_return = true:suggestion + +# Null-checking preferences dotnet_style_coalesce_expression = true:suggestion -csharp_style_var_for_built_in_types = true:error -csharp_style_var_when_type_is_apparent = true:error +dotnet_style_null_propagation = true:suggestion + +# CSharp code style settings: +[*.cs] +# Modifier preferences +csharp_preferred_modifier_order = public,private,protected,internal,const,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion + +# Implicit and explicit types +csharp_style_var_for_built_in_types = true:suggestion +csharp_style_var_when_type_is_apparent = true:suggestion csharp_style_var_elsewhere = true:suggestion -csharp_style_expression_bodied_methods = true:suggestion -csharp_style_expression_bodied_constructors = true:suggestion -csharp_style_expression_bodied_operators = true:suggestion + +# Expression-bodied members +# Explicitly disabled due to difference in coding style between source and tests +#csharp_style_expression_bodied_methods = false:silent +#csharp_style_expression_bodied_constructors = false:silent +csharp_style_expression_bodied_operators = false:silent csharp_style_expression_bodied_properties = true:suggestion csharp_style_expression_bodied_indexers = true:suggestion csharp_style_expression_bodied_accessors = true:suggestion + +# Pattern matching csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion csharp_style_pattern_matching_over_as_with_null_check = true:suggestion + +# Inlined variable declarations csharp_style_inlined_variable_declaration = true:suggestion + +# Expression-level preferences +csharp_prefer_simple_default_expression = true:suggestion +csharp_style_deconstructed_variable_declaration = true:suggestion +csharp_style_pattern_local_over_anonymous_function = true:suggestion + +# Null-checking preference csharp_style_throw_expression = true:suggestion csharp_style_conditional_delegate_call = true:suggestion + +# Code block preferences +csharp_prefer_braces = true:suggestion + +## Formatting conventions +# Dotnet formatting settings: +[*.{cs,vb}] +# Organize usings +dotnet_sort_system_directives_first = true +dotnet_separate_import_directive_groups = false + +# CSharp formatting settings: +[*.cs] +# Newline options +csharp_new_line_before_open_brace = all +csharp_new_line_before_else = true +csharp_new_line_before_catch = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_between_query_expression_clauses = true + +# Identation options +csharp_indent_block_contents = true +csharp_indent_braces = false csharp_indent_case_contents_when_block = false +csharp_indent_switch_labels = true +csharp_indent_case_contents = true +csharp_indent_labels = no_change + +# Spacing options +csharp_space_after_cast = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_around_binary_operators = before_and_after +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_semicolon_in_for_statement = true +csharp_space_around_declaration_statements = do_not_ignore +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_square_brackets = false + +# Wrap options +csharp_preserve_single_line_statements = true +csharp_preserve_single_line_blocks = true + +## Naming conventions +[*.{cs,vb}] + +## Naming styles + +dotnet_naming_style.pascal_case_style.capitalization = pascal_case +dotnet_naming_style.camel_case_style.capitalization = camel_case + +# PascalCase with I prefix +dotnet_naming_style.interface_style.capitalization = pascal_case +dotnet_naming_style.interface_style.required_prefix = I + +# PascalCase with T prefix +dotnet_naming_style.type_parameter_style.capitalization = pascal_case +dotnet_naming_style.type_parameter_style.required_prefix = T + +# camelCase with _ prefix +dotnet_naming_style._camelCase.capitalization = camel_case +dotnet_naming_style._camelCase.required_prefix = _ + +## Rules +# Interfaces +dotnet_naming_symbols.interface_symbol.applicable_kinds = interface +dotnet_naming_symbols.interface_symbol.applicable_accessibilities = * +dotnet_naming_rule.interface_naming.symbols = interface_symbol +dotnet_naming_rule.interface_naming.style = interface_style +dotnet_naming_rule.interface_naming.severity = suggestion + +# Classes, Structs, Enums, Properties, Methods, Local Functions, Events, Namespaces +dotnet_naming_symbols.class_symbol.applicable_kinds = class, struct, enum, property, method, local_function, event, namespace, delegate +dotnet_naming_symbols.class_symbol.applicable_accessibilities = * + +dotnet_naming_rule.class_naming.symbols = class_symbol +dotnet_naming_rule.class_naming.style = pascal_case_style +dotnet_naming_rule.class_naming.severity = suggestion + +# Type Parameters +dotnet_naming_symbols.type_parameter_symbol.applicable_kinds = type_parameter +dotnet_naming_symbols.type_parameter_symbol.applicable_accessibilities = * + +dotnet_naming_rule.type_parameter_naming.symbols = type_parameter_symbol +dotnet_naming_rule.type_parameter_naming.style = type_parameter_style +dotnet_naming_rule.type_parameter_naming.severity = suggestion + +# Visible Fields +dotnet_naming_symbols.public_field_symbol.applicable_kinds = field +dotnet_naming_symbols.public_field_symbol.applicable_accessibilities = public, internal, protected, protected_internal, private_protected + +dotnet_naming_rule.public_field_naming.symbols = public_field_symbol +dotnet_naming_rule.public_field_naming.style = pascal_case_style +dotnet_naming_rule.public_field_naming.severity = suggestion + +# Private constant Fields +dotnet_naming_symbols.const_field_symbol.applicable_kinds = field +dotnet_naming_symbols.const_field_symbol.applicable_accessibilities = private +dotnet_naming_symbols.const_field_symbol.required_modifiers = const + +dotnet_naming_rule.const_field_naming.symbols = const_field_symbol +dotnet_naming_rule.const_field_naming.style = pascal_case_style +dotnet_naming_rule.const_field_naming.severity = suggestion + +# Private Fields +dotnet_naming_symbols.private_field_symbol.applicable_kinds = field +dotnet_naming_symbols.private_field_symbol.applicable_accessibilities = private + +dotnet_naming_rule.private_field_naming.symbols = private_field_symbol +dotnet_naming_rule.private_field_naming.style = _camelCase +dotnet_naming_rule.private_field_naming.severity = suggestion + +# Parameters +dotnet_naming_symbols.parameter_symbol.applicable_kinds = parameter +dotnet_naming_symbols.parameter_symbol.applicable_accessibilities = * + +dotnet_naming_rule.parameter_naming.symbols = parameter_symbol +dotnet_naming_rule.parameter_naming.style = camel_case_style +dotnet_naming_rule.parameter_naming.severity = suggestion + +# Everything Local +dotnet_naming_symbols.everything_else.applicable_kinds = local +dotnet_naming_symbols.everything_else.applicable_accessibilities = * + +dotnet_naming_rule.everything_else_naming.symbols = everything_else +dotnet_naming_rule.everything_else_naming.style = camel_case_style +dotnet_naming_rule.everything_else_naming.severity = suggestion diff --git a/EFCore.NamingConventions.Test/NameRewritingConventionTest.cs b/EFCore.NamingConventions.Test/NameRewritingConventionTest.cs index b4dc0ec..666bb80 100644 --- a/EFCore.NamingConventions.Test/NameRewritingConventionTest.cs +++ b/EFCore.NamingConventions.Test/NameRewritingConventionTest.cs @@ -1,9 +1,11 @@ using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Globalization; using System.Linq; using Microsoft.EntityFrameworkCore; using Xunit; +// ReSharper disable UnusedMember.Global namespace EFCore.NamingConventions.Test { @@ -22,7 +24,7 @@ namespace EFCore.NamingConventions.Test { using var context = CreateContext(); var entityType = context.Model.FindEntityType(typeof(SimpleBlog)); - Assert.Equal("id", entityType.FindProperty("Id").GetColumnName()); + Assert.Equal("id_with_special_name", entityType.FindProperty("IdWithSpecialName").GetColumnName()); Assert.Equal("full_name", entityType.FindProperty("FullName").GetColumnName()); } @@ -31,7 +33,7 @@ namespace EFCore.NamingConventions.Test { using var context = CreateContext(CultureInfo.CreateSpecificCulture("tr-TR")); var entityType = context.Model.FindEntityType(typeof(SimpleBlog)); - Assert.Equal("ıd", entityType.FindProperty("Id").GetColumnName()); + Assert.Equal("ıd_with_special_name", entityType.FindProperty("IdWithSpecialName").GetColumnName()); Assert.Equal("full_name", entityType.FindProperty("FullName").GetColumnName()); } @@ -40,7 +42,7 @@ namespace EFCore.NamingConventions.Test { using var context = CreateContext(CultureInfo.InvariantCulture); var entityType = context.Model.FindEntityType(typeof(SimpleBlog)); - Assert.Equal("id", entityType.FindProperty("Id").GetColumnName()); + Assert.Equal("id_with_special_name", entityType.FindProperty("IdWithSpecialName").GetColumnName()); Assert.Equal("full_name", entityType.FindProperty("FullName").GetColumnName()); } @@ -102,12 +104,10 @@ namespace EFCore.NamingConventions.Test public class TestContext : DbContext { - readonly Func _useNamingConvention; + private readonly Func _useNamingConvention; public TestContext(Func useNamingConvention) => _useNamingConvention = useNamingConvention; - public DbSet Blog { get; set; } - protected override void OnModelCreating(ModelBuilder modelBuilder) => modelBuilder.Entity(e => { @@ -123,7 +123,8 @@ namespace EFCore.NamingConventions.Test public class SimpleBlog { - public int Id { get; set; } + [Key] + public int IdWithSpecialName { get; set; } public string FullName { get; set; } public int SomeAlternativeKey { get; set; } diff --git a/EFCore.NamingConventions.sln.DotSettings b/EFCore.NamingConventions.sln.DotSettings index c587f90..10b8b9b 100644 --- a/EFCore.NamingConventions.sln.DotSettings +++ b/EFCore.NamingConventions.sln.DotSettings @@ -1,24 +1,230 @@  + True + True + Copy + Resources.cs + True + VISIBLE_FILES + WARNING + HINT + HINT + HINT + HINT + HINT + HINT + HINT + HINT - - No + WARNING + HINT + WARNING + WARNING + WARNING + SUGGESTION + SUGGESTION + HINT + DO_NOT_SHOW + DO_NOT_SHOW + WARNING + WARNING + WARNING + WARNING + WARNING True - InternalsOnly - - True + <?xml version="1.0" encoding="utf-16"?><Profile name="EntityFramework"><HtmlReformatCode>True</HtmlReformatCode><CSArrangeThisQualifier>True</CSArrangeThisQualifier><CSRemoveCodeRedundancies>True</CSRemoveCodeRedundancies><CSUseAutoProperty>True</CSUseAutoProperty><CSMakeFieldReadonly>True</CSMakeFieldReadonly><CSUseVar><BehavourStyle>CAN_CHANGE_TO_IMPLICIT</BehavourStyle><LocalVariableStyle>ALWAYS_IMPLICIT</LocalVariableStyle><ForeachVariableStyle>ALWAYS_IMPLICIT</ForeachVariableStyle></CSUseVar><CSOptimizeUsings><OptimizeUsings>True</OptimizeUsings><EmbraceInRegion>False</EmbraceInRegion><RegionName></RegionName></CSOptimizeUsings><CSShortenReferences>True</CSShortenReferences><CSReformatCode>True</CSReformatCode><XMLReformatCode>True</XMLReformatCode><CSUpdateFileHeader>True</CSUpdateFileHeader><CSharpFormatDocComments>True</CSharpFormatDocComments><RemoveCodeRedundancies>True</RemoveCodeRedundancies><CSMakeAutoPropertyGetOnly>True</CSMakeAutoPropertyGetOnly><CSArrangeQualifiers>True</CSArrangeQualifiers><CSEnforceVarKeywordUsageSettings>True</CSEnforceVarKeywordUsageSettings><CSFixBuiltinTypeReferences>True</CSFixBuiltinTypeReferences><CSCodeStyleAttributes ArrangeTypeAccessModifier="True" ArrangeTypeMemberAccessModifier="True" SortModifiers="True" RemoveRedundantParentheses="False" AddMissingParentheses="False" ArrangeBraces="False" ArrangeAttributes="True" ArrangeArgumentsStyle="False" /></Profile> - - Implicit + EntityFramework + EntityFramework + Named + Named + Required + Required + Required + Required + True + False + False + False + False + True + False + True + NEXT_LINE_SHIFTED_2 + 0 + SEPARATE + + + + ALWAYS_ADD + ALWAYS_ADD + ALWAYS_ADD + ALWAYS_ADD + ALWAYS_ADD + ALWAYS_ADD + False + NEXT_LINE + 1 + 1 + True + False + False + True + True + 80 + 2 NEVER - False + False + NEVER + NEVER + False + NEVER + NEVER + True + False + True + LINE_BREAK False + True + False True - True - True - True - True - True - True + True + True + True + CHOP_IF_LONG + True + True + False + True + CHOP_IF_LONG + CHOP_IF_LONG + 140 + True + CHOP_ALWAYS + CHOP_IF_LONG + True - + True + 140 + 140 + False + True + + True + + + Copyright (c) .NET Foundation. All rights reserved. +Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + + True + True + True + Side by side + Side by side + False + False + False + True + False + False + True + False + False + False + True + <Policy Inspect="True" Prefix="" Suffix="" Style="aa_bb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aa_bb" /> + True + FK + $object$_On$event$ + <Policy Inspect="True" Prefix="_" Suffix="" Style="aaBb" /> + <Policy><Descriptor Staticness="Static, Instance" AccessRightKinds="Public" Description="Test Methods"><ElementKinds><Kind Name="TEST_MEMBER" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="Aa_bb" /></Policy> + EF + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="I" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="T" Suffix="" Style="AaBb" /> + $object$_On$event$ + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + + + True + C:\repos\EntityFrameworkCore\All.sln.DotSettings + + + + True + 2 + DO_NOTHING + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True \ No newline at end of file diff --git a/EFCore.NamingConventions/NamingConventions/Internal/LowerCaseNameRewriter.cs b/EFCore.NamingConventions/NamingConventions/Internal/LowerCaseNameRewriter.cs index 1bf42e6..7a55144 100644 --- a/EFCore.NamingConventions/NamingConventions/Internal/LowerCaseNameRewriter.cs +++ b/EFCore.NamingConventions/NamingConventions/Internal/LowerCaseNameRewriter.cs @@ -4,7 +4,7 @@ namespace EFCore.NamingConventions.Internal { public class LowerCaseNameRewriter : INameRewriter { - readonly CultureInfo _culture; + private readonly CultureInfo _culture; public LowerCaseNameRewriter(CultureInfo culture) => _culture = culture; public string RewriteName(string name) => name.ToLower(_culture); diff --git a/EFCore.NamingConventions/NamingConventions/Internal/NameRewritingConvention.cs b/EFCore.NamingConventions/NamingConventions/Internal/NameRewritingConvention.cs index d9c6ff6..fc3a753 100644 --- a/EFCore.NamingConventions/NamingConventions/Internal/NameRewritingConvention.cs +++ b/EFCore.NamingConventions/NamingConventions/Internal/NameRewritingConvention.cs @@ -12,7 +12,7 @@ namespace EFCore.NamingConventions.Internal IForeignKeyOwnershipChangedConvention, IKeyAddedConvention, IForeignKeyAddedConvention, IIndexAddedConvention { - readonly INameRewriter _namingNameRewriter; + private readonly INameRewriter _namingNameRewriter; public NameRewritingConvention(INameRewriter nameRewriter) => _namingNameRewriter = nameRewriter; diff --git a/EFCore.NamingConventions/NamingConventions/Internal/NamingConvention.cs b/EFCore.NamingConventions/NamingConventions/Internal/NamingConvention.cs index d2549d0..c8da151 100644 --- a/EFCore.NamingConventions/NamingConventions/Internal/NamingConvention.cs +++ b/EFCore.NamingConventions/NamingConventions/Internal/NamingConvention.cs @@ -1,6 +1,6 @@ namespace EFCore.NamingConventions.Internal { - enum NamingConvention + public enum NamingConvention { None, SnakeCase, diff --git a/EFCore.NamingConventions/NamingConventions/Internal/NamingConventionSetPlugin.cs b/EFCore.NamingConventions/NamingConventions/Internal/NamingConventionSetPlugin.cs index 147d0bc..01f9abe 100644 --- a/EFCore.NamingConventions/NamingConventions/Internal/NamingConventionSetPlugin.cs +++ b/EFCore.NamingConventions/NamingConventions/Internal/NamingConventionSetPlugin.cs @@ -9,7 +9,7 @@ namespace EFCore.NamingConventions.Internal { public class NamingConventionSetPlugin : IConventionSetPlugin { - readonly IDbContextOptions _options; + private readonly IDbContextOptions _options; public NamingConventionSetPlugin([NotNull] IDbContextOptions options) => _options = options; public ConventionSet ModifyConventions(ConventionSet conventionSet) @@ -18,14 +18,17 @@ namespace EFCore.NamingConventions.Internal var namingStyle = extension.NamingConvention; var culture = extension.Culture; if (namingStyle == NamingConvention.None) + { return conventionSet; + } + var convention = new NameRewritingConvention(namingStyle switch { NamingConvention.SnakeCase => new SnakeCaseNameRewriter(culture ?? CultureInfo.InvariantCulture), NamingConvention.LowerCase => new LowerCaseNameRewriter(culture ?? CultureInfo.InvariantCulture), NamingConvention.UpperCase => new UpperCaseNameRewriter(culture ?? CultureInfo.InvariantCulture), NamingConvention.UpperSnakeCase => new UpperSnakeCaseNameRewriter(culture ?? CultureInfo.InvariantCulture), - _ => throw new NotImplementedException("Unhandled enum value: " + namingStyle) + _ => throw new ArgumentOutOfRangeException("Unhandled enum value: " + namingStyle) }); conventionSet.EntityTypeAddedConventions.Add(convention); diff --git a/EFCore.NamingConventions/NamingConventions/Internal/NamingConventionsOptionsExtension.cs b/EFCore.NamingConventions/NamingConventions/Internal/NamingConventionsOptionsExtension.cs index 50318dd..234427c 100644 --- a/EFCore.NamingConventions/NamingConventions/Internal/NamingConventionsOptionsExtension.cs +++ b/EFCore.NamingConventions/NamingConventions/Internal/NamingConventionsOptionsExtension.cs @@ -2,7 +2,6 @@ using System; using System.Collections.Generic; using System.Globalization; using System.Text; -using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.Extensions.DependencyInjection; using JetBrains.Annotations; @@ -11,9 +10,9 @@ namespace EFCore.NamingConventions.Internal { public class NamingConventionsOptionsExtension : IDbContextOptionsExtension { - DbContextOptionsExtensionInfo _info; - NamingConvention _namingConvention; - CultureInfo _culture; + private DbContextOptionsExtensionInfo _info; + private NamingConvention _namingConvention; + private CultureInfo _culture; public NamingConventionsOptionsExtension() {} protected NamingConventionsOptionsExtension([NotNull] NamingConventionsOptionsExtension copyFrom) @@ -73,13 +72,13 @@ namespace EFCore.NamingConventions.Internal public void ApplyServices(IServiceCollection services) => services.AddEntityFrameworkNamingConventions(); - sealed class ExtensionInfo : DbContextOptionsExtensionInfo + private sealed class ExtensionInfo : DbContextOptionsExtensionInfo { - string _logFragment; + private string _logFragment; public ExtensionInfo(IDbContextOptionsExtension extension) : base(extension) {} - new NamingConventionsOptionsExtension Extension + private new NamingConventionsOptionsExtension Extension => (NamingConventionsOptionsExtension)base.Extension; public override bool IsDatabaseProvider => false; @@ -97,9 +96,8 @@ namespace EFCore.NamingConventions.Internal NamingConvention.SnakeCase => "using snake-case naming ", NamingConvention.LowerCase => "using lower case naming", NamingConvention.UpperCase => "using upper case naming", - NamingConvention.UpperSnakeCase => "using upper snake-case namming", - _ => throw new NotImplementedException("Unhandled enum value: " + - Extension._namingConvention) + NamingConvention.UpperSnakeCase => "using upper snake-case naming", + _ => throw new ArgumentOutOfRangeException("Unhandled enum value: " + Extension._namingConvention) }); if (Extension._culture is null) diff --git a/EFCore.NamingConventions/NamingConventions/Internal/SnakeCaseNameRewriter.cs b/EFCore.NamingConventions/NamingConventions/Internal/SnakeCaseNameRewriter.cs index 0bdc135..80228dd 100644 --- a/EFCore.NamingConventions/NamingConventions/Internal/SnakeCaseNameRewriter.cs +++ b/EFCore.NamingConventions/NamingConventions/Internal/SnakeCaseNameRewriter.cs @@ -6,14 +6,16 @@ namespace EFCore.NamingConventions.Internal { public class SnakeCaseNameRewriter : INameRewriter { - readonly CultureInfo _culture; + private readonly CultureInfo _culture; public SnakeCaseNameRewriter(CultureInfo culture) => _culture = culture; public virtual string RewriteName(string name) { if (string.IsNullOrEmpty(name)) + { return name; + } var builder = new StringBuilder(name.Length + Math.Min(2, name.Length / 5)); var previousCategory = default(UnicodeCategory?); @@ -50,12 +52,16 @@ namespace EFCore.NamingConventions.Internal case UnicodeCategory.LowercaseLetter: case UnicodeCategory.DecimalDigitNumber: if (previousCategory == UnicodeCategory.SpaceSeparator) + { builder.Append('_'); + } break; default: if (previousCategory != null) + { previousCategory = UnicodeCategory.SpaceSeparator; + } continue; } diff --git a/EFCore.NamingConventions/NamingConventions/Internal/UpperCaseNameRewriter.cs b/EFCore.NamingConventions/NamingConventions/Internal/UpperCaseNameRewriter.cs index 44054ba..b398043 100644 --- a/EFCore.NamingConventions/NamingConventions/Internal/UpperCaseNameRewriter.cs +++ b/EFCore.NamingConventions/NamingConventions/Internal/UpperCaseNameRewriter.cs @@ -4,7 +4,7 @@ namespace EFCore.NamingConventions.Internal { public class UpperCaseNameRewriter : INameRewriter { - readonly CultureInfo _culture; + private readonly CultureInfo _culture; public UpperCaseNameRewriter(CultureInfo culture) => _culture = culture; public string RewriteName(string name) => name.ToUpper(_culture); diff --git a/EFCore.NamingConventions/NamingConventions/Internal/UpperSnakeCaseNameRewriter.cs b/EFCore.NamingConventions/NamingConventions/Internal/UpperSnakeCaseNameRewriter.cs index ce288ec..7b6df2b 100644 --- a/EFCore.NamingConventions/NamingConventions/Internal/UpperSnakeCaseNameRewriter.cs +++ b/EFCore.NamingConventions/NamingConventions/Internal/UpperSnakeCaseNameRewriter.cs @@ -4,7 +4,7 @@ namespace EFCore.NamingConventions.Internal { public class UpperSnakeCaseNameRewriter : SnakeCaseNameRewriter { - readonly CultureInfo _culture; + private readonly CultureInfo _culture; public UpperSnakeCaseNameRewriter(CultureInfo culture) : base(culture) => _culture = culture;