Skip to content
This repository was archived by the owner on Feb 1, 2025. It is now read-only.

Commit e83d7ab

Browse files
committed
updates + v4 migration
1 parent 51835a4 commit e83d7ab

File tree

13 files changed

+81
-105
lines changed

13 files changed

+81
-105
lines changed

Build/linq2db.Default.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<Project>
22
<PropertyGroup>
3-
<Version>2.5.0</Version>
3+
<Version>2.6.0</Version>
44

55
<Authors>Svyatoslav Danyliv, Igor Tkachev, Dmitry Lukashenko, Ilya Chudin</Authors>
66
<Product>Linq to DB</Product>

Directory.Packages.props

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
<Project>
22
<ItemGroup>
3-
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="16.10.0" />
4-
<PackageVersion Include="NUnit3TestAdapter" Version="4.0.0" />
5-
<PackageVersion Include="NUnit" Version="3.13.2" />
6-
<PackageVersion Include="FluentAssertions" Version="5.10.3" />
3+
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.2.0" />
4+
<PackageVersion Include="NUnit3TestAdapter" Version="4.2.1" />
5+
<PackageVersion Include="NUnit" Version="3.13.3" />
6+
<PackageVersion Include="FluentAssertions" Version="6.6.0" />
77

8-
<PackageVersion Include="linq2db" Version="3.7.0" />
9-
<PackageVersion Include="linq2db.Tools" Version="3.7.0" />
8+
<PackageVersion Include="linq2db" Version="4.0.0" />
9+
<PackageVersion Include="linq2db.Tools" Version="4.0.0" />
1010

1111
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="1.1.1" />
1212
<PackageVersion Include="Microsoft.Bcl.AsyncInterfaces" Version="6.0.0" />

NuGet/linq2db.EntityFrameworkCore.nuspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
<dependencies>
1717
<group targetFramework=".NETStandard2.0">
1818
<dependency id="Microsoft.EntityFrameworkCore.Relational" version="2.2.6" />
19-
<dependency id="linq2db" version="3.7.0" />
19+
<dependency id="linq2db" version="4.0.0" />
2020
</group>
2121
</dependencies>
2222
</metadata>

Source/LinqToDB.EntityFrameworkCore/EFCoreMetadataReader.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,12 @@ public T[] GetAttributes<T>(Type type, MemberInfo memberInfo, bool inherit = tru
226226
.Any(a =>
227227
{
228228
if (a.Name.EndsWith(":ValueGenerationStrategy"))
229-
return a.Value?.ToString().Contains("Identity") == true;
229+
{
230+
var value = a.Value?.ToString();
231+
232+
if (value != null && (value.Contains("Identity") || value.Contains("Serial")))
233+
return true;
234+
};
230235

231236
if (a.Name.EndsWith(":Autoincrement"))
232237
return a.Value is bool b && b;
@@ -568,7 +573,7 @@ string PrepareExpressionText(Expression? expr)
568573
if (expr is SqlFunctionExpression sqlFunction)
569574
{
570575
var text = sqlFunction.FunctionName;
571-
if (!sqlFunction.Schema.IsNullOrEmpty())
576+
if (!string.IsNullOrEmpty(sqlFunction.Schema))
572577
text = sqlFunction.Schema + "." + sqlFunction.FunctionName;
573578

574579
if (!sqlFunction.IsNiladic)

Source/LinqToDB.EntityFrameworkCore/LinqToDBExtensionsAdapter.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -189,30 +189,30 @@ public Task<long> LongCountAsync<TSource>(
189189
=> EntityFrameworkQueryableExtensions.LongCountAsync(source, predicate, token);
190190

191191
/// <inheritdoc cref="EntityFrameworkQueryableExtensions.MinAsync{TSource}(IQueryable{TSource}, CancellationToken)"/>
192-
public Task<TSource> MinAsync<TSource>(
192+
public Task<TSource?> MinAsync<TSource>(
193193
IQueryable<TSource> source,
194194
CancellationToken token)
195-
=> EntityFrameworkQueryableExtensions.MinAsync(source, token);
195+
=> EntityFrameworkQueryableExtensions.MinAsync(source, token)!;
196196

197197
/// <inheritdoc cref="EntityFrameworkQueryableExtensions.MinAsync{TSource, TResult}(IQueryable{TSource}, Expression{Func{TSource, TResult}}, CancellationToken)"/>
198-
public Task<TResult> MinAsync<TSource,TResult>(
198+
public Task<TResult?> MinAsync<TSource,TResult>(
199199
IQueryable<TSource> source,
200200
Expression<Func<TSource,TResult>> selector,
201201
CancellationToken token)
202-
=> EntityFrameworkQueryableExtensions.MinAsync(source, selector, token);
202+
=> EntityFrameworkQueryableExtensions.MinAsync(source, selector, token)!;
203203

204204
/// <inheritdoc cref="EntityFrameworkQueryableExtensions.MaxAsync{TSource}(IQueryable{TSource}, CancellationToken)"/>
205-
public Task<TSource> MaxAsync<TSource>(
205+
public Task<TSource?> MaxAsync<TSource>(
206206
IQueryable<TSource> source,
207207
CancellationToken token)
208-
=> EntityFrameworkQueryableExtensions.MaxAsync(source, token);
208+
=> EntityFrameworkQueryableExtensions.MaxAsync(source, token)!;
209209

210210
/// <inheritdoc cref="EntityFrameworkQueryableExtensions.MaxAsync{TSource, TResult}(IQueryable{TSource}, Expression{Func{TSource, TResult}}, CancellationToken)"/>
211-
public Task<TResult> MaxAsync<TSource,TResult>(
211+
public Task<TResult?> MaxAsync<TSource,TResult>(
212212
IQueryable<TSource> source,
213213
Expression<Func<TSource,TResult>> selector,
214214
CancellationToken token)
215-
=> EntityFrameworkQueryableExtensions.MaxAsync(source, selector, token);
215+
=> EntityFrameworkQueryableExtensions.MaxAsync(source, selector, token)!;
216216

217217
#region SumAsync
218218

Source/LinqToDB.EntityFrameworkCore/LinqToDBForEFExtensions.Async.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -168,26 +168,26 @@ public static Task<long> LongCountAsyncLinqToDB<TSource>(
168168
=> AsyncExtensions.LongCountAsync(source.ToLinqToDB(), predicate, token);
169169

170170
/// <inheritdoc cref="AsyncExtensions.MinAsync{TSource}(IQueryable{TSource}, CancellationToken)"/>
171-
public static Task<TSource> MinAsyncLinqToDB<TSource>(
171+
public static Task<TSource?> MinAsyncLinqToDB<TSource>(
172172
this IQueryable<TSource> source,
173173
CancellationToken token = default)
174174
=> AsyncExtensions.MinAsync(source.ToLinqToDB(), token);
175175

176176
/// <inheritdoc cref="AsyncExtensions.MinAsync{TSource, TResult}(IQueryable{TSource}, Expression{Func{TSource, TResult}}, CancellationToken)"/>
177-
public static Task<TResult> MinAsyncLinqToDB<TSource,TResult>(
177+
public static Task<TResult?> MinAsyncLinqToDB<TSource,TResult>(
178178
this IQueryable<TSource> source,
179179
Expression<Func<TSource,TResult>> selector,
180180
CancellationToken token = default)
181181
=> AsyncExtensions.MinAsync(source.ToLinqToDB(), selector, token);
182182

183183
/// <inheritdoc cref="AsyncExtensions.MaxAsync{TSource}(IQueryable{TSource}, CancellationToken)"/>
184-
public static Task<TSource> MaxAsyncLinqToDB<TSource>(
184+
public static Task<TSource?> MaxAsyncLinqToDB<TSource>(
185185
this IQueryable<TSource> source,
186186
CancellationToken token = default)
187187
=> AsyncExtensions.MaxAsync(source.ToLinqToDB(), token);
188188

189189
/// <inheritdoc cref="AsyncExtensions.MaxAsync{TSource, TResult}(IQueryable{TSource}, Expression{Func{TSource, TResult}}, CancellationToken)"/>
190-
public static Task<TResult> MaxAsyncLinqToDB<TSource,TResult>(
190+
public static Task<TResult?> MaxAsyncLinqToDB<TSource,TResult>(
191191
this IQueryable<TSource> source,
192192
Expression<Func<TSource,TResult>> selector,
193193
CancellationToken token = default)

Source/LinqToDB.EntityFrameworkCore/LinqToDBForEFTools.Mapping.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,6 @@ static void InitializeSqlServerMapping()
9494
}
9595
}
9696

97-
#endregion
97+
#endregion
9898
}
9999
}

Source/LinqToDB.EntityFrameworkCore/LinqToDBForEFToolsDataConnection.cs

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@ namespace LinqToDB.EntityFrameworkCore
1919
using DataProvider;
2020
using Linq;
2121
using Expressions;
22+
using LinqToDB.Interceptors;
23+
using System.Data.Common;
2224

2325
/// <summary>
2426
/// linq2db EF.Core data connection.
2527
/// </summary>
26-
public class LinqToDBForEFToolsDataConnection : DataConnection, IExpressionPreprocessor
28+
public class LinqToDBForEFToolsDataConnection : DataConnection, IExpressionPreprocessor, IEntityServiceInterceptor
2729
{
2830
readonly IModel? _model;
2931
readonly Func<Expression, IDataContext, DbContext?, IModel?, Expression>? _transformFunc;
@@ -67,7 +69,7 @@ public LinqToDBForEFToolsDataConnection(
6769
_transformFunc = transformFunc;
6870
CopyDatabaseProperties();
6971
if (LinqToDBForEFTools.EnableChangeTracker)
70-
OnEntityCreated += OnEntityCreatedHandler;
72+
AddInterceptor(this);
7173
}
7274

7375
/// <summary>
@@ -80,9 +82,9 @@ public LinqToDBForEFToolsDataConnection(
8082
/// <param name="transformFunc">Expression converter.</param>
8183
public LinqToDBForEFToolsDataConnection(
8284
DbContext? context,
83-
[NotNull] IDataProvider dataProvider,
84-
[NotNull] IDbTransaction transaction,
85-
IModel? model,
85+
[NotNull] IDataProvider dataProvider,
86+
[NotNull] DbTransaction transaction,
87+
IModel? model,
8688
Func<Expression, IDataContext, DbContext?, IModel?, Expression>? transformFunc
8789
) : base(dataProvider, transaction)
8890
{
@@ -91,7 +93,7 @@ public LinqToDBForEFToolsDataConnection(
9193
_transformFunc = transformFunc;
9294
CopyDatabaseProperties();
9395
if (LinqToDBForEFTools.EnableChangeTracker)
94-
OnEntityCreated += OnEntityCreatedHandler;
96+
AddInterceptor(this);
9597
}
9698

9799
/// <summary>
@@ -105,7 +107,7 @@ public LinqToDBForEFToolsDataConnection(
105107
public LinqToDBForEFToolsDataConnection(
106108
DbContext? context,
107109
[NotNull] IDataProvider dataProvider,
108-
[NotNull] IDbConnection connection,
110+
[NotNull] DbConnection connection,
109111
IModel? model,
110112
Func<Expression, IDataContext, DbContext?, IModel?, Expression>? transformFunc) : base(dataProvider, connection)
111113
{
@@ -114,7 +116,7 @@ public LinqToDBForEFToolsDataConnection(
114116
_transformFunc = transformFunc;
115117
CopyDatabaseProperties();
116118
if (LinqToDBForEFTools.EnableChangeTracker)
117-
OnEntityCreated += OnEntityCreatedHandler;
119+
AddInterceptor(this);
118120
}
119121

120122
/// <summary>
@@ -157,7 +159,7 @@ public override bool Equals(object? obj)
157159
return true;
158160
}
159161

160-
if (obj.GetType() != this.GetType())
162+
if (obj.GetType() != GetType())
161163
{
162164
return false;
163165
}
@@ -174,35 +176,34 @@ public override int GetHashCode()
174176
}
175177
}
176178

177-
private void OnEntityCreatedHandler(EntityCreatedEventArgs args)
179+
object IEntityServiceInterceptor.EntityCreated(EntityCreatedEventData eventData, object entity)
178180
{
179181
// Do not allow to store in ChangeTracker temporary tables
180-
if ((args.TableOptions & TableOptions.IsTemporaryOptionSet) != 0)
181-
return;
182+
if ((eventData.TableOptions & TableOptions.IsTemporaryOptionSet) != 0)
183+
return entity;
182184

183185
// Do not allow to store in ChangeTracker tables from different server
184-
if (args.ServerName != null)
185-
return;
186+
if (eventData.ServerName != null)
187+
return entity;
186188

187189
if (!LinqToDBForEFTools.EnableChangeTracker
188190
|| !Tracking
189191
|| Context!.ChangeTracker.QueryTrackingBehavior == QueryTrackingBehavior.NoTracking)
190-
return;
192+
return entity;
191193

192-
var type = args.Entity.GetType();
194+
var type = entity.GetType();
193195
if (_lastType != type)
194196
{
195197
_lastType = type;
196198
_lastEntityType = Context.Model.FindEntityType(type);
197199
}
198200

199201
if (_lastEntityType == null)
200-
return;
201-
202+
return entity;
202203

203204
// Do not allow to store in ChangeTracker tables that has different name
204-
if (args.TableName != _lastEntityType.Relational().TableName)
205-
return;
205+
if (eventData.TableName != _lastEntityType.Relational().TableName)
206+
return entity;
206207

207208
if (_stateManager == null)
208209
_stateManager = Context.GetService<IStateManager>();
@@ -221,16 +222,16 @@ private void OnEntityCreatedHandler(EntityCreatedEventArgs args)
221222
});
222223

223224
if (retrievalFunc == null)
224-
return;
225+
return entity;
225226

226-
entry = retrievalFunc(_stateManager, args.Entity);
227+
entry = retrievalFunc(_stateManager, entity);
227228

228229
if (entry == null)
229230
{
230-
entry = _stateManager.StartTrackingFromQuery(_lastEntityType, args.Entity, ValueBuffer.Empty, null);
231+
entry = _stateManager.StartTrackingFromQuery(_lastEntityType, entity, ValueBuffer.Empty, null);
231232
}
232233

233-
args.Entity = entry.Entity;
234+
return entry.Entity;
234235
}
235236

236237
private Func<IStateManager, object, InternalEntityEntry?>? CreateEntityRetrievalFunc(IEntityType entityType)

Source/LinqToDB.EntityFrameworkCore/LinqToDBForEFToolsImplDefault.cs

Lines changed: 10 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -169,23 +169,22 @@ protected virtual IDataProvider CreateLinqToDbDataProvider(EFProviderInfo provid
169169
return CreateSqlServerProvider(SqlServerDefaultVersion, connectionInfo.ConnectionString);
170170
case ProviderName.MySql:
171171
case ProviderName.MySqlConnector:
172-
return new MySqlDataProvider(provInfo.ProviderName);
172+
return MySqlTools.GetDataProvider(provInfo.ProviderName);
173173
case ProviderName.PostgreSQL:
174174
return CreatePostgreSqlProvider(PostgreSqlDefaultVersion, connectionInfo.ConnectionString);
175175
case ProviderName.SQLite:
176-
return new SQLiteDataProvider(provInfo.ProviderName);
176+
return SQLiteTools.GetDataProvider(provInfo.ProviderName);
177177
case ProviderName.Firebird:
178-
return new FirebirdDataProvider();
178+
return FirebirdTools.GetDataProvider();
179179
case ProviderName.DB2:
180-
return new DB2DataProvider(ProviderName.DB2, DB2Version.LUW);
181180
case ProviderName.DB2LUW:
182-
return new DB2DataProvider(ProviderName.DB2, DB2Version.LUW);
181+
return DB2Tools.GetDataProvider(DB2Version.LUW);
183182
case ProviderName.DB2zOS:
184-
return new DB2DataProvider(ProviderName.DB2, DB2Version.zOS);
183+
return DB2Tools.GetDataProvider(DB2Version.zOS);
185184
case ProviderName.Oracle:
186-
return new OracleDataProvider(provInfo.ProviderName, OracleVersion.v11);
185+
return OracleTools.GetDataProvider(provInfo.ProviderName, version: OracleVersion.v11);
187186
case ProviderName.SqlCe:
188-
return new SqlCeDataProvider();
187+
return SqlCeTools.GetDataProvider();
189188
//case ProviderName.Access:
190189
// return new AccessDataProvider();
191190

@@ -326,34 +325,10 @@ protected virtual IDataProvider CreateLinqToDbDataProvider(EFProviderInfo provid
326325
/// <returns>linq2db SQL Server provider instance.</returns>
327326
protected virtual IDataProvider CreateSqlServerProvider(SqlServerVersion version, string? connectionString)
328327
{
329-
string providerName;
330-
331328
if (!string.IsNullOrEmpty(connectionString))
332-
{
333-
providerName = "Microsoft.Data.SqlClient";
329+
return DataConnection.GetDataProvider("Microsoft.Data.SqlClient", connectionString!)!;
334330

335-
return DataConnection.GetDataProvider(providerName, connectionString!)!;
336-
}
337-
338-
switch (version)
339-
{
340-
case SqlServerVersion.v2000:
341-
providerName = ProviderName.SqlServer2000;
342-
break;
343-
case SqlServerVersion.v2005:
344-
providerName = ProviderName.SqlServer2005;
345-
break;
346-
case SqlServerVersion.v2008:
347-
providerName = ProviderName.SqlServer2008;
348-
break;
349-
case SqlServerVersion.v2012:
350-
providerName = ProviderName.SqlServer2012;
351-
break;
352-
default:
353-
throw new ArgumentOutOfRangeException($"Version '{version}' is not supported.");
354-
}
355-
356-
return new SqlServerDataProvider(providerName, version);
331+
return DataProvider.SqlServer.SqlServerTools.GetDataProvider(version, SqlServerProvider.MicrosoftDataSqlClient);
357332
}
358333

359334
/// <summary>
@@ -367,23 +342,7 @@ protected virtual IDataProvider CreatePostgreSqlProvider(PostgreSQLVersion versi
367342
if (!string.IsNullOrEmpty(connectionString))
368343
return DataConnection.GetDataProvider(ProviderName.PostgreSQL, connectionString!)!;
369344

370-
string providerName;
371-
switch (version)
372-
{
373-
case PostgreSQLVersion.v92:
374-
providerName = ProviderName.PostgreSQL92;
375-
break;
376-
case PostgreSQLVersion.v93:
377-
providerName = ProviderName.PostgreSQL93;
378-
break;
379-
case PostgreSQLVersion.v95:
380-
providerName = ProviderName.PostgreSQL95;
381-
break;
382-
default:
383-
throw new ArgumentOutOfRangeException(nameof(version), version, null);
384-
}
385-
386-
return new PostgreSQLDataProvider(providerName, version);
345+
return PostgreSQLTools.GetDataProvider(version);
387346
}
388347

389348
/// <summary>

Source/LinqToDB.EntityFrameworkCore/linq2db.EntityFrameworkCore.csproj

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212
<DocumentationFile>bin\$(Configuration)\$(TargetFramework)\linq2db.EntityFrameworkCore.xml</DocumentationFile>
1313

1414
<NoWarn>EF1001</NoWarn>
15-
16-
<LangVersion>latest</LangVersion>
1715
</PropertyGroup>
1816

1917
<PropertyGroup Condition="'$(Configuration)'=='Release'">

0 commit comments

Comments
 (0)