Skip to content

Commit 36657a0

Browse files
committed
upgraded to .net 9
1 parent 01ba014 commit 36657a0

File tree

16 files changed

+478
-257
lines changed

16 files changed

+478
-257
lines changed

.editorconfig

Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
###############################
2+
# PandaTech Editor Config #
3+
###############################
4+
5+
6+
################################
7+
# ReSharper Generated Settings #
8+
################################
9+
10+
[*]
11+
charset = utf-8-bom
12+
end_of_line = crlf
13+
trim_trailing_whitespace = false
14+
insert_final_newline = false
15+
indent_style = space
16+
indent_size = 4
17+
18+
# Microsoft .NET properties
19+
csharp_preferred_modifier_order = public, private, protected, internal, file, new, static, abstract, virtual, sealed, readonly, override, extern, unsafe, volatile, async, required:suggestion
20+
csharp_style_prefer_utf8_string_literals = true:suggestion
21+
csharp_style_var_elsewhere = true:suggestion
22+
csharp_style_var_for_built_in_types = true:suggestion
23+
csharp_style_var_when_type_is_apparent = true:suggestion
24+
dotnet_naming_rule.unity_serialized_field_rule.import_to_resharper = True
25+
dotnet_naming_rule.unity_serialized_field_rule.resharper_description = Unity serialized field
26+
dotnet_naming_rule.unity_serialized_field_rule.resharper_guid = 5f0fdb63-c892-4d2c-9324-15c80b22a7ef
27+
dotnet_naming_rule.unity_serialized_field_rule.severity = warning
28+
dotnet_naming_rule.unity_serialized_field_rule.style = lower_camel_case_style
29+
dotnet_naming_rule.unity_serialized_field_rule.symbols = unity_serialized_field_symbols
30+
dotnet_naming_style.lower_camel_case_style.capitalization = camel_case
31+
dotnet_naming_symbols.unity_serialized_field_symbols.applicable_accessibilities = *
32+
dotnet_naming_symbols.unity_serialized_field_symbols.applicable_kinds =
33+
dotnet_naming_symbols.unity_serialized_field_symbols.resharper_applicable_kinds = unity_serialised_field
34+
dotnet_naming_symbols.unity_serialized_field_symbols.resharper_required_modifiers = instance
35+
dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:none
36+
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:none
37+
dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary:none
38+
dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
39+
dotnet_style_predefined_type_for_member_access = true:suggestion
40+
dotnet_style_qualification_for_event = false:suggestion
41+
dotnet_style_qualification_for_field = false:suggestion
42+
dotnet_style_qualification_for_method = false:suggestion
43+
dotnet_style_qualification_for_property = false:suggestion
44+
dotnet_style_require_accessibility_modifiers = for_non_interface_members:suggestion
45+
46+
# ReSharper properties
47+
resharper_align_linq_query = true
48+
resharper_align_multiline_calls_chain = true
49+
resharper_apply_auto_detected_rules = false
50+
resharper_braces_for_for = required
51+
resharper_braces_for_foreach = required
52+
resharper_braces_for_ifelse = required
53+
resharper_braces_for_while = required
54+
resharper_cpp_insert_final_newline = true
55+
resharper_csharp_indent_size = 3
56+
resharper_csharp_max_enum_members_on_line = 0
57+
resharper_csharp_tab_width = 3
58+
resharper_csharp_wrap_arguments_style = chop_if_long
59+
resharper_csharp_wrap_parameters_style = chop_if_long
60+
resharper_formatter_off_tag = @formatter:off
61+
resharper_formatter_on_tag = @formatter:on
62+
resharper_formatter_tags_enabled = true
63+
resharper_keep_existing_declaration_parens_arrangement = false
64+
resharper_keep_existing_expr_member_arrangement = false
65+
resharper_keep_existing_initializer_arrangement = false
66+
resharper_keep_existing_switch_expression_arrangement = false
67+
resharper_max_array_initializer_elements_on_line = 0
68+
resharper_max_initializer_elements_on_line = 0
69+
resharper_place_accessorholder_attribute_on_same_line = false
70+
resharper_place_accessor_attribute_on_same_line = false
71+
resharper_place_field_attribute_on_same_line = false
72+
resharper_place_simple_anonymousmethod_on_single_line = false
73+
resharper_place_simple_embedded_statement_on_same_line = false
74+
resharper_place_simple_initializer_on_single_line = false
75+
resharper_place_simple_property_pattern_on_single_line = false
76+
resharper_use_indent_from_vs = false
77+
resharper_wrap_after_property_in_chained_method_calls = true
78+
resharper_wrap_array_initializer_style = chop_if_long
79+
resharper_wrap_chained_method_calls = chop_always
80+
resharper_wrap_linq_expressions = chop_always
81+
resharper_wrap_list_pattern = chop_if_long
82+
resharper_wrap_object_and_collection_initializer_style = chop_always
83+
resharper_wrap_property_pattern = chop_always
84+
85+
# ReSharper inspection severities
86+
resharper_arrange_redundant_parentheses_highlighting = hint
87+
resharper_arrange_this_qualifier_highlighting = hint
88+
resharper_arrange_type_member_modifiers_highlighting = hint
89+
resharper_arrange_type_modifiers_highlighting = hint
90+
resharper_built_in_type_reference_style_for_member_access_highlighting = hint
91+
resharper_built_in_type_reference_style_highlighting = hint
92+
resharper_enforce_foreach_statement_braces_highlighting = warning
93+
resharper_enforce_for_statement_braces_highlighting = warning
94+
resharper_enforce_if_statement_braces_highlighting = warning
95+
resharper_enforce_lock_statement_braces_highlighting = warning
96+
resharper_enforce_using_statement_braces_highlighting = warning
97+
resharper_enforce_while_statement_braces_highlighting = warning
98+
resharper_mvc_action_not_resolved_highlighting = warning
99+
resharper_mvc_area_not_resolved_highlighting = warning
100+
resharper_mvc_controller_not_resolved_highlighting = warning
101+
resharper_mvc_masterpage_not_resolved_highlighting = warning
102+
resharper_mvc_partial_view_not_resolved_highlighting = warning
103+
resharper_mvc_template_not_resolved_highlighting = warning
104+
resharper_mvc_view_component_not_resolved_highlighting = warning
105+
resharper_mvc_view_component_view_not_resolved_highlighting = warning
106+
resharper_mvc_view_not_resolved_highlighting = warning
107+
resharper_razor_assembly_not_resolved_highlighting = warning
108+
resharper_redundant_base_qualifier_highlighting = warning
109+
resharper_web_config_module_not_resolved_highlighting = warning
110+
resharper_web_config_type_not_resolved_highlighting = warning
111+
resharper_web_config_wrong_module_highlighting = warning
112+
113+
[{*.har,*.jsb2,*.jsb3,*.json,*.jsonc,*.postman_collection,*.postman_collection.json,*.postman_environment,*.postman_environment.json,.babelrc,.eslintrc,.prettierrc,.stylelintrc,.ws-context,bowerrc,jest.config}]
114+
indent_style = space
115+
indent_size = 2
116+
117+
[{*.yaml,*.yml}]
118+
indent_style = space
119+
indent_size = 2
120+
121+
[*.cs]
122+
indent_style = space
123+
indent_size = 3
124+
tab_width = 3
125+
126+
[*.{appxmanifest,asax,ascx,aspx,axaml,build,c,c++,c++m,cc,ccm,cginc,compute,cp,cpp,cppm,cshtml,cu,cuh,cxx,cxxm,dtd,fs,fsi,fsscript,fsx,fx,fxh,h,hh,hlsl,hlsli,hlslinc,hpp,hxx,inc,inl,ino,ipp,ixx,master,ml,mli,mpp,mq4,mq5,mqh,mxx,nuspec,paml,razor,resw,resx,shader,skin,tpp,usf,ush,uxml,vb,xaml,xamlx,xoml,xsd}]
127+
indent_style = space
128+
indent_size = 4
129+
tab_width = 4
130+
131+
#########################
132+
# Custom added settings #
133+
#########################
134+
[*.cs]
135+
dotnet_diagnostic.cs8600.severity = error #Converting null literal or possible null value to non-nullable type.
136+
dotnet_diagnostic.cs8601.severity = error #Possible null reference assignment.
137+
dotnet_diagnostic.cs8602.severity = error #possible dereference of a null reference
138+
dotnet_diagnostic.cs8603.severity = error #possible null reference return
139+
dotnet_diagnostic.cs8604.severity = error #possible null reference argument for parameter
140+
dotnet_diagnostic.cs8605.severity = error #Unboxing a possibly null value
141+
dotnet_diagnostic.cs8618.severity = error # Non-nullable field is uninitialized. Consider declaring as nullable.
142+
dotnet_diagnostic.cs8625.severity = error # Cannot convert null literal to non-nullable reference type.
143+
dotnet_diagnostic.cs8762.severity = error # Nullability of reference types in type doesn't match overridden member.
144+
dotnet_diagnostic.cs1717.severity = error #variable is assigned to itself
145+
dotnet_diagnostic.cs1718.severity = error #comparison made to same variable
146+
dotnet_diagnostic.cs0659.severity = error #overriding object.Equals but not overriding object.GetHashCode
147+
dotnet_diagnostic.cs0251.severity = error #Indexing an array with a negative index (array indices always start at zero)
148+
dotnet_diagnostic.s3363.severity = none #Never set DateTime as PrimaryKey. Ignored as we never do it but have warnings for cache entities.
149+
dotnet_diagnostic.ca2016.severity = error #Forwarding cancellation tokens
150+
csharp_style_namespace_declarations = file_scoped:error
151+
resharper_entity_framework_model_validation_unlimited_string_length_highlighting = none
152+
153+
154+
#########################
155+
# VS added settings #
156+
#########################
157+
158+
[*.cs]
159+
csharp_style_namespace_declarations = file_scoped:error
160+
csharp_indent_labels = one_less_than_current
161+
csharp_using_directive_placement = outside_namespace:silent
162+
csharp_prefer_simple_using_statement = true:suggestion
163+
csharp_prefer_braces = true:silent
164+
csharp_style_prefer_method_group_conversion = true:silent
165+
csharp_style_prefer_top_level_statements = true:silent
166+
csharp_style_prefer_primary_constructors = true:suggestion
167+
csharp_style_expression_bodied_methods = false:silent
168+
csharp_style_expression_bodied_constructors = false:silent
169+
csharp_style_expression_bodied_operators = false:silent
170+
csharp_style_expression_bodied_properties = true:silent
171+
csharp_style_expression_bodied_indexers = true:silent
172+
csharp_style_expression_bodied_accessors = true:silent
173+
csharp_style_expression_bodied_lambdas = true:silent
174+
csharp_style_expression_bodied_local_functions = false:silent
175+
176+
[{*.yaml,*.yml}]
177+
dotnet_style_namespace_match_folder = true:suggestion
178+
dotnet_style_operator_placement_when_wrapping = beginning_of_line
179+
tab_width = 3
180+
dotnet_style_coalesce_expression = true:suggestion
181+
dotnet_style_null_propagation = true:suggestion
182+
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
183+
dotnet_style_prefer_auto_properties = true:silent
184+
dotnet_style_object_initializer = true:suggestion
185+
dotnet_style_collection_initializer = true:suggestion
186+
dotnet_style_prefer_simplified_boolean_expressions = true:suggestion
187+
dotnet_style_prefer_conditional_expression_over_assignment = true:silent
188+
189+
[*.csv]
190+
indent_style = tab
191+
tab_width = 4

.github/workflows/main.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ jobs:
1616

1717
steps:
1818
- name: Checkout
19-
uses: actions/checkout@v3
19+
uses: actions/checkout@v4
2020

2121
- name: Setup .NET Core
22-
uses: actions/setup-dotnet@v3
22+
uses: actions/setup-dotnet@v4
2323
with:
2424
global-json-file: global.json
2525

EFCore.PostgresExtensions.sln

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
1616
.gitignore = .gitignore
1717
Readme.md = Readme.md
1818
global.json = global.json
19+
.editorconfig = .editorconfig
1920
EndProjectSection
2021
EndProject
2122
Global

Readme.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,10 +116,12 @@ public partial class PgFunction : Migration
116116
}
117117
}
118118
```
119+
119120
#### Additional notes
120-
- The random incrementing sequence feature ensures the generated IDs are unique, non-sequential, and non-predictable, enhancing security.
121-
- The feature supports only `long` data type (`bigint` in PostgreSQL).
122121

122+
- The random incrementing sequence feature ensures the generated IDs are unique, non-sequential, and non-predictable,
123+
enhancing security.
124+
- The feature supports only `long` data type (`bigint` in PostgreSQL).
123125

124126
### Npgsql COPY Integration (Obsolete: Use EFCore.BulkExtensions.PostgreSql instead)
125127

global.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"sdk": {
3-
"version": "8.0.200",
4-
"rollForward": "latestMajor"
3+
"version": "9.0.100",
4+
"rollForward": "latestMinor"
55
}
66
}
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>net8.0</TargetFramework>
4+
<TargetFramework>net9.0</TargetFramework>
55
<ImplicitUsings>enable</ImplicitUsings>
66
<Nullable>enable</Nullable>
77
<PackageIcon>pandatech.png</PackageIcon>
88
<PackageReadmeFile>Readme.md</PackageReadmeFile>
99
<Authors>Pandatech</Authors>
1010
<Copyright>MIT</Copyright>
11-
<Version>3.0.0</Version>
11+
<Version>4.0.0</Version>
1212
<PackageId>Pandatech.EFCore.PostgresExtensions</PackageId>
1313
<Title>Pandatech.EFCore.PostgresExtensions</Title>
1414
<PackageTags>Pandatech, library, EntityFrameworkCore, PostgreSQL, For Update, Lock, LockingSyntax, Bulk insert, BinaryCopy</PackageTags>
1515
<Description>The Pandatech.EFCore.PostgresExtensions library enriches Entity Framework Core applications with advanced PostgreSQL functionalities, starting with the ForUpdate locking syntax and BulkInsert function. Designed for seamless integration, this NuGet package aims to enhance the efficiency and capabilities of EF Core models when working with PostgreSQL, with the potential for further PostgreSQL-specific extensions.</Description>
1616
<RepositoryUrl>https://github.com/PandaTechAM/be-lib-efcore-postgres-extensions</RepositoryUrl>
17-
<PackageReleaseNotes>Random Incrementing Sequence Generation Feature</PackageReleaseNotes>
17+
<PackageReleaseNotes>.net 9 upgrade</PackageReleaseNotes>
1818
</PropertyGroup>
1919

2020
<ItemGroup>
@@ -23,7 +23,7 @@
2323
</ItemGroup>
2424

2525
<ItemGroup>
26-
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.4" />
26+
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.1"/>
2727
</ItemGroup>
2828

2929
</Project>
Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,33 @@
1-
namespace EFCore.PostgresExtensions.Enums
2-
{
3-
public enum LockBehavior
4-
{
5-
/// <summary>
6-
/// Using this behavior forces transaction to wait until row is unlocked.
7-
/// </summary>
8-
Default = 0,
1+
namespace EFCore.PostgresExtensions.Enums;
92

10-
/// <summary>
11-
/// Using this behavior will skip rows that are locked by another transaction.
12-
/// </summary>
13-
SkipLocked = 1,
3+
public enum LockBehavior
4+
{
5+
/// <summary>
6+
/// Using this behavior forces transaction to wait until row is unlocked.
7+
/// </summary>
8+
Default = 0,
149

15-
/// <summary>
16-
/// Using this behavior will throw an exception if requested rows are locked by another transaction.
17-
/// </summary>
18-
NoWait = 2,
19-
}
10+
/// <summary>
11+
/// Using this behavior will skip rows that are locked by another transaction.
12+
/// </summary>
13+
SkipLocked = 1,
2014

21-
public static class LockBehaviorExtensions
22-
{
23-
public static string GetSqlKeyword(this LockBehavior lockBehavior) => lockBehavior switch
24-
{
25-
LockBehavior.Default => string.Empty,
26-
LockBehavior.SkipLocked => "skip locked",
27-
LockBehavior.NoWait => "nowait",
28-
_ => string.Empty,
29-
};
30-
}
15+
/// <summary>
16+
/// Using this behavior will throw an exception if requested rows are locked by another transaction.
17+
/// </summary>
18+
NoWait = 2
3119
}
20+
21+
public static class LockBehaviorExtensions
22+
{
23+
public static string GetSqlKeyword(this LockBehavior lockBehavior)
24+
{
25+
return lockBehavior switch
26+
{
27+
LockBehavior.Default => string.Empty,
28+
LockBehavior.SkipLocked => "skip locked",
29+
LockBehavior.NoWait => "nowait",
30+
_ => string.Empty
31+
};
32+
}
33+
}

src/EFCore.PostgresExtensions/Extensions/BulkInsertExtension/BulkInsertExtensionSync.cs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,13 +119,19 @@ private static void ConvertEnumValue<T>(int columnCount,
119119
if (!propertyTypes[i].IsGenericType || propertyTypes[i]
120120
.GetGenericTypeDefinition() != typeof(List<>) ||
121121
!propertyTypes[i]
122-
.GetGenericArguments()[0].IsEnum) continue;
122+
.GetGenericArguments()[0].IsEnum)
123+
{
124+
continue;
125+
}
123126

124127
var enumMapping = properties[i]
125128
.FindTypeMapping();
126129

127130
// Only proceed if the mapping is for an array type, as expected for lists
128-
if (enumMapping is not NpgsqlArrayTypeMapping) continue;
131+
if (enumMapping is not NpgsqlArrayTypeMapping)
132+
{
133+
continue;
134+
}
129135

130136
var list = (IList)values[i]!;
131137
var underlyingType = Enum.GetUnderlyingType(propertyTypes[i]
@@ -153,9 +159,14 @@ private static DbContext PrepareBulkInsertOperation<T>(DbSet<T> dbSet,
153159

154160

155161
if (entities == null || entities.Count == 0)
162+
{
156163
throw new ArgumentException("The model list cannot be null or empty.");
164+
}
157165

158-
if (context == null) throw new ArgumentNullException(nameof(context), "The DbContext instance cannot be null.");
166+
if (context == null)
167+
{
168+
throw new ArgumentNullException(nameof(context), "The DbContext instance cannot be null.");
169+
}
159170

160171

161172
var entityType = context.Model.FindEntityType(typeof(T))! ??
@@ -168,14 +179,18 @@ private static DbContext PrepareBulkInsertOperation<T>(DbSet<T> dbSet,
168179
.ToList();
169180

170181
if (pkGeneratedByDb)
182+
{
171183
properties = properties.Where(x => !x.IsKey())
172184
.ToList();
185+
}
173186

174187
var columnNames = properties.Select(x => $"\"{x.GetColumnName()}\"")
175188
.ToList();
176189

177190
if (columnNames.Count == 0)
191+
{
178192
throw new InvalidOperationException("Column names are null or empty.");
193+
}
179194

180195

181196
columnCount = columnNames.Count;

0 commit comments

Comments
 (0)