From 51835a43d2549a05cd3a06bf59796324a223ecaf Mon Sep 17 00:00:00 2001 From: Svyatoslav Danyliv Date: Fri, 8 Apr 2022 16:02:01 +0300 Subject: [PATCH 1/4] Added better Insert skip check. --- .../EFCoreMetadataReader.cs | 15 ++++++++++++++- .../Models/NpgSqlEntities/EntityWithXmin.cs | 14 ++++++++++++++ .../NpgSqlEntities/NpgSqlEnititesContext.cs | 7 +++++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 Tests/LinqToDB.EntityFrameworkCore.PostgreSQL.Tests/Models/NpgSqlEntities/EntityWithXmin.cs diff --git a/Source/LinqToDB.EntityFrameworkCore/EFCoreMetadataReader.cs b/Source/LinqToDB.EntityFrameworkCore/EFCoreMetadataReader.cs index 1992788..fa82844 100644 --- a/Source/LinqToDB.EntityFrameworkCore/EFCoreMetadataReader.cs +++ b/Source/LinqToDB.EntityFrameworkCore/EFCoreMetadataReader.cs @@ -259,6 +259,17 @@ public T[] GetAttributes(Type type, MemberInfo memberInfo, bool inherit = tru } } + var behaviour = prop.BeforeSaveBehavior; + var skipOnInsert = prop.ValueGenerated.HasFlag(ValueGenerated.OnAdd); + + if (skipOnInsert) + { + skipOnInsert = isIdentity || behaviour != PropertySaveBehavior.Save; + } + + var skipOnUpdate = behaviour != PropertySaveBehavior.Save || + prop.ValueGenerated.HasFlag(ValueGenerated.OnUpdate); + return new T[] { (T)(Attribute)new ColumnAttribute @@ -271,7 +282,9 @@ public T[] GetAttributes(Type type, MemberInfo memberInfo, bool inherit = tru IsPrimaryKey = isPrimaryKey, PrimaryKeyOrder = primaryKeyOrder, IsIdentity = isIdentity, - IsDiscriminator = discriminator == prop + IsDiscriminator = discriminator == prop, + SkipOnInsert = skipOnInsert, + SkipOnUpdate = skipOnUpdate } }; } diff --git a/Tests/LinqToDB.EntityFrameworkCore.PostgreSQL.Tests/Models/NpgSqlEntities/EntityWithXmin.cs b/Tests/LinqToDB.EntityFrameworkCore.PostgreSQL.Tests/Models/NpgSqlEntities/EntityWithXmin.cs new file mode 100644 index 0000000..b4896ee --- /dev/null +++ b/Tests/LinqToDB.EntityFrameworkCore.PostgreSQL.Tests/Models/NpgSqlEntities/EntityWithXmin.cs @@ -0,0 +1,14 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace LinqToDB.EntityFrameworkCore.PostgreSQL.Tests.Models.NpgSqlEntities +{ + public class EntityWithXmin + { + [Key] + public int Id { get; set; } + + public uint xmin { get; set; } + public string Value { get; set; } = null!; + } +} diff --git a/Tests/LinqToDB.EntityFrameworkCore.PostgreSQL.Tests/Models/NpgSqlEntities/NpgSqlEnititesContext.cs b/Tests/LinqToDB.EntityFrameworkCore.PostgreSQL.Tests/Models/NpgSqlEntities/NpgSqlEnititesContext.cs index d758c1d..8a19879 100644 --- a/Tests/LinqToDB.EntityFrameworkCore.PostgreSQL.Tests/Models/NpgSqlEntities/NpgSqlEnititesContext.cs +++ b/Tests/LinqToDB.EntityFrameworkCore.PostgreSQL.Tests/Models/NpgSqlEntities/NpgSqlEnititesContext.cs @@ -26,10 +26,17 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) modelBuilder.Entity(entity => { }); + + modelBuilder.Entity(entity => + { + entity.ForNpgsqlUseXminAsConcurrencyToken(); + }); + } public virtual DbSet Events { get; set; } = null!; public virtual DbSet EntityWithArrays { get; set; } = null!; + public virtual DbSet EntityWithXmin { get; set; } = null!; } } From e83d7ab55d27a50fc590247678c3f6af56ff943b Mon Sep 17 00:00:00 2001 From: Svyatoslav Danyliv Date: Wed, 25 May 2022 11:10:15 +0300 Subject: [PATCH 2/4] updates + v4 migration --- Build/linq2db.Default.props | 2 +- Directory.Packages.props | 12 ++-- NuGet/linq2db.EntityFrameworkCore.nuspec | 2 +- .../EFCoreMetadataReader.cs | 9 ++- .../LinqToDBExtensionsAdapter.cs | 16 ++--- .../LinqToDBForEFExtensions.Async.cs | 8 +-- .../LinqToDBForEFTools.Mapping.cs | 2 +- .../LinqToDBForEFToolsDataConnection.cs | 49 +++++++-------- .../LinqToDBForEFToolsImplDefault.cs | 61 +++---------------- .../linq2db.EntityFrameworkCore.csproj | 2 - .../ForMappingTestsBase.cs | 6 +- .../NpgSqlTests.cs | 13 ++++ azure-pipelines.yml | 4 +- 13 files changed, 81 insertions(+), 105 deletions(-) diff --git a/Build/linq2db.Default.props b/Build/linq2db.Default.props index b9e3264..f44d61d 100644 --- a/Build/linq2db.Default.props +++ b/Build/linq2db.Default.props @@ -1,6 +1,6 @@  - 2.5.0 + 2.6.0 Svyatoslav Danyliv, Igor Tkachev, Dmitry Lukashenko, Ilya Chudin Linq to DB diff --git a/Directory.Packages.props b/Directory.Packages.props index 8c42caa..5518bbf 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -1,12 +1,12 @@  - - - - + + + + - - + + diff --git a/NuGet/linq2db.EntityFrameworkCore.nuspec b/NuGet/linq2db.EntityFrameworkCore.nuspec index 16440e1..17938a1 100644 --- a/NuGet/linq2db.EntityFrameworkCore.nuspec +++ b/NuGet/linq2db.EntityFrameworkCore.nuspec @@ -16,7 +16,7 @@ - + diff --git a/Source/LinqToDB.EntityFrameworkCore/EFCoreMetadataReader.cs b/Source/LinqToDB.EntityFrameworkCore/EFCoreMetadataReader.cs index fa82844..aa40737 100644 --- a/Source/LinqToDB.EntityFrameworkCore/EFCoreMetadataReader.cs +++ b/Source/LinqToDB.EntityFrameworkCore/EFCoreMetadataReader.cs @@ -226,7 +226,12 @@ public T[] GetAttributes(Type type, MemberInfo memberInfo, bool inherit = tru .Any(a => { if (a.Name.EndsWith(":ValueGenerationStrategy")) - return a.Value?.ToString().Contains("Identity") == true; + { + var value = a.Value?.ToString(); + + if (value != null && (value.Contains("Identity") || value.Contains("Serial"))) + return true; + }; if (a.Name.EndsWith(":Autoincrement")) return a.Value is bool b && b; @@ -568,7 +573,7 @@ string PrepareExpressionText(Expression? expr) if (expr is SqlFunctionExpression sqlFunction) { var text = sqlFunction.FunctionName; - if (!sqlFunction.Schema.IsNullOrEmpty()) + if (!string.IsNullOrEmpty(sqlFunction.Schema)) text = sqlFunction.Schema + "." + sqlFunction.FunctionName; if (!sqlFunction.IsNiladic) diff --git a/Source/LinqToDB.EntityFrameworkCore/LinqToDBExtensionsAdapter.cs b/Source/LinqToDB.EntityFrameworkCore/LinqToDBExtensionsAdapter.cs index 485989e..c15ee70 100644 --- a/Source/LinqToDB.EntityFrameworkCore/LinqToDBExtensionsAdapter.cs +++ b/Source/LinqToDB.EntityFrameworkCore/LinqToDBExtensionsAdapter.cs @@ -189,30 +189,30 @@ public Task LongCountAsync( => EntityFrameworkQueryableExtensions.LongCountAsync(source, predicate, token); /// - public Task MinAsync( + public Task MinAsync( IQueryable source, CancellationToken token) - => EntityFrameworkQueryableExtensions.MinAsync(source, token); + => EntityFrameworkQueryableExtensions.MinAsync(source, token)!; /// - public Task MinAsync( + public Task MinAsync( IQueryable source, Expression> selector, CancellationToken token) - => EntityFrameworkQueryableExtensions.MinAsync(source, selector, token); + => EntityFrameworkQueryableExtensions.MinAsync(source, selector, token)!; /// - public Task MaxAsync( + public Task MaxAsync( IQueryable source, CancellationToken token) - => EntityFrameworkQueryableExtensions.MaxAsync(source, token); + => EntityFrameworkQueryableExtensions.MaxAsync(source, token)!; /// - public Task MaxAsync( + public Task MaxAsync( IQueryable source, Expression> selector, CancellationToken token) - => EntityFrameworkQueryableExtensions.MaxAsync(source, selector, token); + => EntityFrameworkQueryableExtensions.MaxAsync(source, selector, token)!; #region SumAsync diff --git a/Source/LinqToDB.EntityFrameworkCore/LinqToDBForEFExtensions.Async.cs b/Source/LinqToDB.EntityFrameworkCore/LinqToDBForEFExtensions.Async.cs index 302eef8..cf8b9c1 100644 --- a/Source/LinqToDB.EntityFrameworkCore/LinqToDBForEFExtensions.Async.cs +++ b/Source/LinqToDB.EntityFrameworkCore/LinqToDBForEFExtensions.Async.cs @@ -168,26 +168,26 @@ public static Task LongCountAsyncLinqToDB( => AsyncExtensions.LongCountAsync(source.ToLinqToDB(), predicate, token); /// - public static Task MinAsyncLinqToDB( + public static Task MinAsyncLinqToDB( this IQueryable source, CancellationToken token = default) => AsyncExtensions.MinAsync(source.ToLinqToDB(), token); /// - public static Task MinAsyncLinqToDB( + public static Task MinAsyncLinqToDB( this IQueryable source, Expression> selector, CancellationToken token = default) => AsyncExtensions.MinAsync(source.ToLinqToDB(), selector, token); /// - public static Task MaxAsyncLinqToDB( + public static Task MaxAsyncLinqToDB( this IQueryable source, CancellationToken token = default) => AsyncExtensions.MaxAsync(source.ToLinqToDB(), token); /// - public static Task MaxAsyncLinqToDB( + public static Task MaxAsyncLinqToDB( this IQueryable source, Expression> selector, CancellationToken token = default) diff --git a/Source/LinqToDB.EntityFrameworkCore/LinqToDBForEFTools.Mapping.cs b/Source/LinqToDB.EntityFrameworkCore/LinqToDBForEFTools.Mapping.cs index c5cba6c..672929f 100644 --- a/Source/LinqToDB.EntityFrameworkCore/LinqToDBForEFTools.Mapping.cs +++ b/Source/LinqToDB.EntityFrameworkCore/LinqToDBForEFTools.Mapping.cs @@ -94,6 +94,6 @@ static void InitializeSqlServerMapping() } } - #endregion + #endregion } } diff --git a/Source/LinqToDB.EntityFrameworkCore/LinqToDBForEFToolsDataConnection.cs b/Source/LinqToDB.EntityFrameworkCore/LinqToDBForEFToolsDataConnection.cs index 06bf165..71543a6 100644 --- a/Source/LinqToDB.EntityFrameworkCore/LinqToDBForEFToolsDataConnection.cs +++ b/Source/LinqToDB.EntityFrameworkCore/LinqToDBForEFToolsDataConnection.cs @@ -19,11 +19,13 @@ namespace LinqToDB.EntityFrameworkCore using DataProvider; using Linq; using Expressions; + using LinqToDB.Interceptors; + using System.Data.Common; /// /// linq2db EF.Core data connection. /// - public class LinqToDBForEFToolsDataConnection : DataConnection, IExpressionPreprocessor + public class LinqToDBForEFToolsDataConnection : DataConnection, IExpressionPreprocessor, IEntityServiceInterceptor { readonly IModel? _model; readonly Func? _transformFunc; @@ -67,7 +69,7 @@ public LinqToDBForEFToolsDataConnection( _transformFunc = transformFunc; CopyDatabaseProperties(); if (LinqToDBForEFTools.EnableChangeTracker) - OnEntityCreated += OnEntityCreatedHandler; + AddInterceptor(this); } /// @@ -80,9 +82,9 @@ public LinqToDBForEFToolsDataConnection( /// Expression converter. public LinqToDBForEFToolsDataConnection( DbContext? context, - [NotNull] IDataProvider dataProvider, - [NotNull] IDbTransaction transaction, - IModel? model, + [NotNull] IDataProvider dataProvider, + [NotNull] DbTransaction transaction, + IModel? model, Func? transformFunc ) : base(dataProvider, transaction) { @@ -91,7 +93,7 @@ public LinqToDBForEFToolsDataConnection( _transformFunc = transformFunc; CopyDatabaseProperties(); if (LinqToDBForEFTools.EnableChangeTracker) - OnEntityCreated += OnEntityCreatedHandler; + AddInterceptor(this); } /// @@ -105,7 +107,7 @@ public LinqToDBForEFToolsDataConnection( public LinqToDBForEFToolsDataConnection( DbContext? context, [NotNull] IDataProvider dataProvider, - [NotNull] IDbConnection connection, + [NotNull] DbConnection connection, IModel? model, Func? transformFunc) : base(dataProvider, connection) { @@ -114,7 +116,7 @@ public LinqToDBForEFToolsDataConnection( _transformFunc = transformFunc; CopyDatabaseProperties(); if (LinqToDBForEFTools.EnableChangeTracker) - OnEntityCreated += OnEntityCreatedHandler; + AddInterceptor(this); } /// @@ -157,7 +159,7 @@ public override bool Equals(object? obj) return true; } - if (obj.GetType() != this.GetType()) + if (obj.GetType() != GetType()) { return false; } @@ -174,22 +176,22 @@ public override int GetHashCode() } } - private void OnEntityCreatedHandler(EntityCreatedEventArgs args) + object IEntityServiceInterceptor.EntityCreated(EntityCreatedEventData eventData, object entity) { // Do not allow to store in ChangeTracker temporary tables - if ((args.TableOptions & TableOptions.IsTemporaryOptionSet) != 0) - return; + if ((eventData.TableOptions & TableOptions.IsTemporaryOptionSet) != 0) + return entity; // Do not allow to store in ChangeTracker tables from different server - if (args.ServerName != null) - return; + if (eventData.ServerName != null) + return entity; if (!LinqToDBForEFTools.EnableChangeTracker || !Tracking || Context!.ChangeTracker.QueryTrackingBehavior == QueryTrackingBehavior.NoTracking) - return; + return entity; - var type = args.Entity.GetType(); + var type = entity.GetType(); if (_lastType != type) { _lastType = type; @@ -197,12 +199,11 @@ private void OnEntityCreatedHandler(EntityCreatedEventArgs args) } if (_lastEntityType == null) - return; - + return entity; // Do not allow to store in ChangeTracker tables that has different name - if (args.TableName != _lastEntityType.Relational().TableName) - return; + if (eventData.TableName != _lastEntityType.Relational().TableName) + return entity; if (_stateManager == null) _stateManager = Context.GetService(); @@ -221,16 +222,16 @@ private void OnEntityCreatedHandler(EntityCreatedEventArgs args) }); if (retrievalFunc == null) - return; + return entity; - entry = retrievalFunc(_stateManager, args.Entity); + entry = retrievalFunc(_stateManager, entity); if (entry == null) { - entry = _stateManager.StartTrackingFromQuery(_lastEntityType, args.Entity, ValueBuffer.Empty, null); + entry = _stateManager.StartTrackingFromQuery(_lastEntityType, entity, ValueBuffer.Empty, null); } - args.Entity = entry.Entity; + return entry.Entity; } private Func? CreateEntityRetrievalFunc(IEntityType entityType) diff --git a/Source/LinqToDB.EntityFrameworkCore/LinqToDBForEFToolsImplDefault.cs b/Source/LinqToDB.EntityFrameworkCore/LinqToDBForEFToolsImplDefault.cs index 8192f2d..1096bc4 100644 --- a/Source/LinqToDB.EntityFrameworkCore/LinqToDBForEFToolsImplDefault.cs +++ b/Source/LinqToDB.EntityFrameworkCore/LinqToDBForEFToolsImplDefault.cs @@ -169,23 +169,22 @@ protected virtual IDataProvider CreateLinqToDbDataProvider(EFProviderInfo provid return CreateSqlServerProvider(SqlServerDefaultVersion, connectionInfo.ConnectionString); case ProviderName.MySql: case ProviderName.MySqlConnector: - return new MySqlDataProvider(provInfo.ProviderName); + return MySqlTools.GetDataProvider(provInfo.ProviderName); case ProviderName.PostgreSQL: return CreatePostgreSqlProvider(PostgreSqlDefaultVersion, connectionInfo.ConnectionString); case ProviderName.SQLite: - return new SQLiteDataProvider(provInfo.ProviderName); + return SQLiteTools.GetDataProvider(provInfo.ProviderName); case ProviderName.Firebird: - return new FirebirdDataProvider(); + return FirebirdTools.GetDataProvider(); case ProviderName.DB2: - return new DB2DataProvider(ProviderName.DB2, DB2Version.LUW); case ProviderName.DB2LUW: - return new DB2DataProvider(ProviderName.DB2, DB2Version.LUW); + return DB2Tools.GetDataProvider(DB2Version.LUW); case ProviderName.DB2zOS: - return new DB2DataProvider(ProviderName.DB2, DB2Version.zOS); + return DB2Tools.GetDataProvider(DB2Version.zOS); case ProviderName.Oracle: - return new OracleDataProvider(provInfo.ProviderName, OracleVersion.v11); + return OracleTools.GetDataProvider(provInfo.ProviderName, version: OracleVersion.v11); case ProviderName.SqlCe: - return new SqlCeDataProvider(); + return SqlCeTools.GetDataProvider(); //case ProviderName.Access: // return new AccessDataProvider(); @@ -326,34 +325,10 @@ protected virtual IDataProvider CreateLinqToDbDataProvider(EFProviderInfo provid /// linq2db SQL Server provider instance. protected virtual IDataProvider CreateSqlServerProvider(SqlServerVersion version, string? connectionString) { - string providerName; - if (!string.IsNullOrEmpty(connectionString)) - { - providerName = "Microsoft.Data.SqlClient"; + return DataConnection.GetDataProvider("Microsoft.Data.SqlClient", connectionString!)!; - return DataConnection.GetDataProvider(providerName, connectionString!)!; - } - - switch (version) - { - case SqlServerVersion.v2000: - providerName = ProviderName.SqlServer2000; - break; - case SqlServerVersion.v2005: - providerName = ProviderName.SqlServer2005; - break; - case SqlServerVersion.v2008: - providerName = ProviderName.SqlServer2008; - break; - case SqlServerVersion.v2012: - providerName = ProviderName.SqlServer2012; - break; - default: - throw new ArgumentOutOfRangeException($"Version '{version}' is not supported."); - } - - return new SqlServerDataProvider(providerName, version); + return DataProvider.SqlServer.SqlServerTools.GetDataProvider(version, SqlServerProvider.MicrosoftDataSqlClient); } /// @@ -367,23 +342,7 @@ protected virtual IDataProvider CreatePostgreSqlProvider(PostgreSQLVersion versi if (!string.IsNullOrEmpty(connectionString)) return DataConnection.GetDataProvider(ProviderName.PostgreSQL, connectionString!)!; - string providerName; - switch (version) - { - case PostgreSQLVersion.v92: - providerName = ProviderName.PostgreSQL92; - break; - case PostgreSQLVersion.v93: - providerName = ProviderName.PostgreSQL93; - break; - case PostgreSQLVersion.v95: - providerName = ProviderName.PostgreSQL95; - break; - default: - throw new ArgumentOutOfRangeException(nameof(version), version, null); - } - - return new PostgreSQLDataProvider(providerName, version); + return PostgreSQLTools.GetDataProvider(version); } /// diff --git a/Source/LinqToDB.EntityFrameworkCore/linq2db.EntityFrameworkCore.csproj b/Source/LinqToDB.EntityFrameworkCore/linq2db.EntityFrameworkCore.csproj index 4238360..30beff3 100644 --- a/Source/LinqToDB.EntityFrameworkCore/linq2db.EntityFrameworkCore.csproj +++ b/Source/LinqToDB.EntityFrameworkCore/linq2db.EntityFrameworkCore.csproj @@ -12,8 +12,6 @@ bin\$(Configuration)\$(TargetFramework)\linq2db.EntityFrameworkCore.xml EF1001 - - latest diff --git a/Tests/LinqToDB.EntityFrameworkCore.BaseTests/ForMappingTestsBase.cs b/Tests/LinqToDB.EntityFrameworkCore.BaseTests/ForMappingTestsBase.cs index 255f988..b66fca8 100644 --- a/Tests/LinqToDB.EntityFrameworkCore.BaseTests/ForMappingTestsBase.cs +++ b/Tests/LinqToDB.EntityFrameworkCore.BaseTests/ForMappingTestsBase.cs @@ -109,12 +109,12 @@ public virtual async Task TestUIntTable() } [Test] - public virtual void TestAmbiguousProperties() + public virtual async Task TestAmbiguousProperties() { using var context = CreateContext(); - FluentActions.Awaiting(() => context.WithDuplicateProperties.Where(x => x.Value == 1) - .ToArrayAsyncLinqToDB()).Should().NotThrow(); + await FluentActions.Awaiting(() => context.WithDuplicateProperties.Where(x => x.Value == 1) + .ToArrayAsyncLinqToDB()).Should().NotThrowAsync(); } } diff --git a/Tests/LinqToDB.EntityFrameworkCore.PostgreSQL.Tests/NpgSqlTests.cs b/Tests/LinqToDB.EntityFrameworkCore.PostgreSQL.Tests/NpgSqlTests.cs index d575ee9..67fe4ff 100644 --- a/Tests/LinqToDB.EntityFrameworkCore.PostgreSQL.Tests/NpgSqlTests.cs +++ b/Tests/LinqToDB.EntityFrameworkCore.PostgreSQL.Tests/NpgSqlTests.cs @@ -89,6 +89,19 @@ where Sql.Ext.PostgreSQL().Overlaps(m.Guids, guids) } */ + [Test] + public void TestConcurrencyToken() + { + using var db = CreateNpgSqlEntitiesContext(); + + var toInsert = Enumerable.Range(1, 10) + .Select(i => new EntityWithXmin { Value = "Str" + i }) + .ToArray(); + + db.BulkCopy(toInsert); + } + + [Test] public void TestUnnest() { diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 5d09c8a..e289f93 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -1,8 +1,8 @@ variables: solution: 'linq2db.EFCore.sln' build_configuration: 'Release' - assemblyVersion: 2.5.0 - nugetVersion: 2.5.0 + assemblyVersion: 2.6.0 + nugetVersion: 2.6.0 artifact_nugets: 'nugets' # build on commits to important branches (master + release branches): From 7abd6114a914205911d6b962cc1f435c97d4872a Mon Sep 17 00:00:00 2001 From: Svyatoslav Danyliv Date: Mon, 30 May 2022 12:24:24 +0300 Subject: [PATCH 3/4] Updated to linq2db 4.0.1 --- Directory.Packages.props | 4 ++-- NuGet/linq2db.EntityFrameworkCore.nuspec | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 5518bbf..57c64cf 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -5,8 +5,8 @@ - - + + diff --git a/NuGet/linq2db.EntityFrameworkCore.nuspec b/NuGet/linq2db.EntityFrameworkCore.nuspec index 17938a1..2996be5 100644 --- a/NuGet/linq2db.EntityFrameworkCore.nuspec +++ b/NuGet/linq2db.EntityFrameworkCore.nuspec @@ -16,7 +16,7 @@ - + From 866f7da05ae54d3eeac2e8f13677cfa46e8c8886 Mon Sep 17 00:00:00 2001 From: Svyatoslav Danyliv Date: Mon, 30 May 2022 12:31:07 +0300 Subject: [PATCH 4/4] Updated copyright. --- Build/linq2db.Default.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Build/linq2db.Default.props b/Build/linq2db.Default.props index f44d61d..71079fb 100644 --- a/Build/linq2db.Default.props +++ b/Build/linq2db.Default.props @@ -5,7 +5,7 @@ Svyatoslav Danyliv, Igor Tkachev, Dmitry Lukashenko, Ilya Chudin Linq to DB linq2db.net - 2002-2021 linq2db.net + 2002-2022 linq2db.net https://github.com/linq2db/linq2db.EntityFrameworkCore git