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

Commit 145a617

Browse files
authored
v2 updates (#267)
* updates * revert dependency update, add missing nuspec dependencies
1 parent abe77cb commit 145a617

File tree

16 files changed

+85
-58
lines changed

16 files changed

+85
-58
lines changed

Directory.Packages.props

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
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.4.0" />
4+
<PackageVersion Include="NUnit3TestAdapter" Version="4.3.0" />
5+
<PackageVersion Include="NUnit" Version="3.13.3" />
6+
<PackageVersion Include="FluentAssertions" Version="6.8.0" />
77

88
<PackageVersion Include="linq2db" Version="4.3.0" />
99
<PackageVersion Include="linq2db.Tools" Version="4.3.0" />

NuGet.config

+6-1
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,9 @@
44
<add key="NuGet" value="https://api.nuget.org/v3/index.json" />
55
<add key="linq2db" value="https://pkgs.dev.azure.com/linq2db/linq2db/_packaging/linq2db/nuget/v3/index.json" />
66
</packageSources>
7-
</configuration>
7+
<packageSourceMapping>
8+
<packageSource key="NuGet">
9+
<package pattern="*" />
10+
</packageSource>
11+
</packageSourceMapping>
12+
</configuration>

NuGet/linq2db.EntityFrameworkCore.nuspec

+4-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<title>Linq to DB (linq2db) extensions for Entity Framework Core 2.x</title>
66
<authors>Igor Tkachev, Ilya Chudin, Svyatoslav Danyliv, Dmitry Lukashenko</authors>
77
<owners>Igor Tkachev, Ilya Chudin, Svyatoslav Danyliv, Dmitry Lukashenko</owners>
8-
<copyright>Copyright © 2020-2021 Igor Tkachev, Ilya Chudin, Svyatoslav Danyliv, Dmitry Lukashenko</copyright>
8+
<copyright>Copyright © 2020-2022 Igor Tkachev, Ilya Chudin, Svyatoslav Danyliv, Dmitry Lukashenko</copyright>
99
<description>Allows to execute Linq to DB (linq2db) queries in Entity Framework Core DbContext.</description>
1010
<summary />
1111
<tags>linq linq2db LinqToDB ORM database entity-framework-core EntityFrameworkCore EFCore DB SQL SqlServer SqlCe SqlServerCe MySql Firebird SQLite Oracle ODP PostgreSQL DB2</tags>
@@ -15,8 +15,10 @@
1515
<license type="file">MIT-LICENSE.txt</license>
1616
<dependencies>
1717
<group targetFramework=".NETStandard2.0">
18-
<dependency id="Microsoft.EntityFrameworkCore.Relational" version="2.2.6" />
1918
<dependency id="linq2db" version="4.3.0" />
19+
<dependency id="Microsoft.EntityFrameworkCore.Relational" version="2.2.6" />
20+
<dependency id="Microsoft.Bcl.AsyncInterfaces" version="6.0.0" />
21+
<dependency id="System.Interactive.Async" version="3.2.0" />
2022
</group>
2123
</dependencies>
2224
</metadata>

Source/LinqToDB.EntityFrameworkCore/EFCoreMetadataReader.cs

+7-8
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ namespace LinqToDB.EntityFrameworkCore
3030
/// <summary>
3131
/// LINQ To DB metadata reader for EF.Core model.
3232
/// </summary>
33-
internal class EFCoreMetadataReader : IMetadataReader
33+
internal sealed class EFCoreMetadataReader : IMetadataReader
3434
{
3535
readonly IModel? _model;
3636
private readonly SqlTranslatingExpressionVisitorDependencies? _dependencies;
@@ -241,7 +241,7 @@ public T[] GetAttributes<T>(Type type, MemberInfo memberInfo, bool inherit = tru
241241
{
242242
if (a.Value is string str)
243243
{
244-
return str.ToLower().Contains("nextval");
244+
return str.ToLowerInvariant().Contains("nextval");
245245
}
246246
}
247247

@@ -260,7 +260,8 @@ public T[] GetAttributes<T>(Type type, MemberInfo memberInfo, bool inherit = tru
260260
}
261261
else
262262
{
263-
dataType = SqlDataType.GetDataType(typeMapping.ClrType).Type.DataType;
263+
var ms = _model != null ? LinqToDBForEFTools.GetMappingSchema(_model, null) : MappingSchema.Default;
264+
dataType = ms.GetDataType(typeMapping.ClrType).Type.DataType;
264265
}
265266
}
266267

@@ -326,7 +327,6 @@ public T[] GetAttributes<T>(Type type, MemberInfo memberInfo, bool inherit = tru
326327
ThisKey = thisKey,
327328
OtherKey = otherKey,
328329
CanBeNull = canBeNull,
329-
IsBackReference = false
330330
});
331331
}
332332
else
@@ -338,7 +338,6 @@ public T[] GetAttributes<T>(Type type, MemberInfo memberInfo, bool inherit = tru
338338
ThisKey = thisKey,
339339
OtherKey = otherKey,
340340
CanBeNull = !fk.IsRequired,
341-
IsBackReference = true
342341
});
343342
}
344343
}
@@ -417,7 +416,7 @@ public T[] GetAttributes<T>(Type type, MemberInfo memberInfo, bool inherit = tru
417416
return Array.Empty<T>();
418417
}
419418

420-
class ValueConverter : IValueConverter
419+
sealed class ValueConverter : IValueConverter
421420
{
422421
public ValueConverter(
423422
LambdaExpression convertToProviderExpression,
@@ -434,7 +433,7 @@ public ValueConverter(
434433

435434
}
436435

437-
class SqlTransparentExpression : Expression
436+
sealed class SqlTransparentExpression : Expression
438437
{
439438
public Expression Expression { get; }
440439

@@ -443,7 +442,7 @@ public SqlTransparentExpression(Expression expression)
443442
Expression = expression;
444443
}
445444

446-
protected bool Equals(SqlTransparentExpression other)
445+
private bool Equals(SqlTransparentExpression other)
447446
{
448447
return ReferenceEquals(this, other);
449448
}

Source/LinqToDB.EntityFrameworkCore/Internal/LinqToDBForEFQueryProvider.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,9 @@ public TResult Execute<TResult>(Expression expression)
9393
return QueryProvider.ExecuteAsyncEnumerable<TResult>(expression, cancellationToken);
9494
}
9595

96-
class AsyncEnumerableWrapper<TResult>: interactive_async::System.Collections.Generic.IAsyncEnumerable<TResult>
96+
sealed class AsyncEnumerableWrapper<TResult>: interactive_async::System.Collections.Generic.IAsyncEnumerable<TResult>
9797
{
98-
public class EnumeratorWrapper : interactive_async::System.Collections.Generic.IAsyncEnumerator<TResult>
98+
public sealed class EnumeratorWrapper : interactive_async::System.Collections.Generic.IAsyncEnumerator<TResult>
9999
{
100100
private readonly bcl_async::System.Collections.Generic.IAsyncEnumerator<TResult> _enumerator;
101101

@@ -106,7 +106,7 @@ public EnumeratorWrapper(bcl_async::System.Collections.Generic.IAsyncEnumerator<
106106

107107
public void Dispose()
108108
{
109-
Task.Run(() =>_enumerator.DisposeAsync()).Wait();
109+
Task.Run(_enumerator.DisposeAsync).Wait();
110110
}
111111

112112
public Task<bool> MoveNext(CancellationToken cancellationToken)

Source/LinqToDB.EntityFrameworkCore/LinqToDBForEFToolsDataConnection.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ public Expression ProcessExpression(Expression expression)
131131
return _transformFunc(expression, this, Context, _model);
132132
}
133133

134-
private class TypeKey
134+
private sealed class TypeKey
135135
{
136136
public TypeKey(IEntityType entityType, IModel? model)
137137
{
@@ -142,7 +142,7 @@ public TypeKey(IEntityType entityType, IModel? model)
142142
public IEntityType EntityType { get; }
143143
public IModel? Model { get; }
144144

145-
protected bool Equals(TypeKey other)
145+
private bool Equals(TypeKey other)
146146
{
147147
return EntityType.Equals(other.EntityType) && Equals(Model, other.Model);
148148
}

Source/LinqToDB.EntityFrameworkCore/LinqToDBForEFToolsImplDefault.cs

+40-27
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ namespace LinqToDB.EntityFrameworkCore
4848
[PublicAPI]
4949
public class LinqToDBForEFToolsImplDefault : ILinqToDBForEFTools
5050
{
51-
class ProviderKey
51+
sealed class ProviderKey
5252
{
5353
public ProviderKey(string? providerName, string? connectionString)
5454
{
@@ -61,7 +61,7 @@ public ProviderKey(string? providerName, string? connectionString)
6161

6262
#region Equality members
6363

64-
protected bool Equals(ProviderKey other)
64+
private bool Equals(ProviderKey other)
6565
{
6666
return string.Equals(ProviderName, other.ProviderName) && string.Equals(ConnectionString, other.ConnectionString);
6767
}
@@ -165,31 +165,44 @@ protected virtual IDataProvider CreateLinqToDbDataProvider(EFProviderInfo provid
165165

166166
switch (provInfo.ProviderName)
167167
{
168-
case ProviderName.SqlServer:
169-
return CreateSqlServerProvider(SqlServerDefaultVersion, connectionInfo.ConnectionString);
170-
case ProviderName.MySql:
171-
case ProviderName.MySqlConnector:
172-
return MySqlTools.GetDataProvider(provInfo.ProviderName);
173-
case ProviderName.PostgreSQL:
174-
return CreatePostgreSqlProvider(PostgreSqlDefaultVersion, connectionInfo.ConnectionString);
175-
case ProviderName.SQLite:
176-
return SQLiteTools.GetDataProvider(provInfo.ProviderName);
177-
case ProviderName.Firebird:
178-
return FirebirdTools.GetDataProvider();
179-
case ProviderName.DB2:
180-
case ProviderName.DB2LUW:
181-
return DB2Tools.GetDataProvider(DB2Version.LUW);
182-
case ProviderName.DB2zOS:
183-
return DB2Tools.GetDataProvider(DB2Version.zOS);
184-
case ProviderName.Oracle:
185-
return OracleTools.GetDataProvider(provInfo.ProviderName, version: OracleVersion.v11);
186-
case ProviderName.SqlCe:
187-
return SqlCeTools.GetDataProvider();
188-
//case ProviderName.Access:
189-
// return new AccessDataProvider();
190-
191-
default:
192-
throw new LinqToDBForEFToolsException($"Can not instantiate data provider '{provInfo.ProviderName}'.");
168+
case ProviderName.SqlServer:
169+
return CreateSqlServerProvider(SqlServerDefaultVersion, connectionInfo.ConnectionString);
170+
case ProviderName.MySql:
171+
case ProviderName.MySqlConnector:
172+
return MySqlTools.GetDataProvider(provInfo.ProviderName);
173+
case ProviderName.PostgreSQL:
174+
return CreatePostgreSqlProvider(PostgreSqlDefaultVersion, connectionInfo.ConnectionString);
175+
case ProviderName.SQLite:
176+
return SQLiteTools.GetDataProvider(provInfo.ProviderName);
177+
case ProviderName.Firebird:
178+
return FirebirdTools.GetDataProvider();
179+
case ProviderName.DB2:
180+
case ProviderName.DB2LUW:
181+
return DB2Tools.GetDataProvider(DB2Version.LUW);
182+
case ProviderName.DB2zOS:
183+
return DB2Tools.GetDataProvider(DB2Version.zOS);
184+
185+
case ProviderName.Oracle11Native:
186+
return OracleTools.GetDataProvider(OracleVersion.v11, OracleProvider.Native);
187+
case ProviderName.OracleNative:
188+
return OracleTools.GetDataProvider(OracleVersion.v12, OracleProvider.Native);
189+
case ProviderName.Oracle11Managed:
190+
return OracleTools.GetDataProvider(OracleVersion.v11, OracleProvider.Managed);
191+
case ProviderName.Oracle:
192+
case ProviderName.OracleManaged:
193+
return OracleTools.GetDataProvider(OracleVersion.v12, OracleProvider.Managed);
194+
case ProviderName.Oracle11Devart:
195+
return OracleTools.GetDataProvider(OracleVersion.v11, OracleProvider.Devart);
196+
case ProviderName.OracleDevart:
197+
return OracleTools.GetDataProvider(OracleVersion.v12, OracleProvider.Devart);
198+
199+
case ProviderName.SqlCe:
200+
return SqlCeTools.GetDataProvider();
201+
//case ProviderName.Access:
202+
// return new AccessDataProvider();
203+
204+
default:
205+
throw new LinqToDBForEFToolsException($"Can not instantiate data provider '{provInfo.ProviderName}'.");
193206
}
194207
}
195208

Tests/LinqToDB.EntityFrameworkCore.BaseTests/Logging/NullExternalScopeProvider.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace LinqToDB.EntityFrameworkCore.BaseTests.Logging
66
/// <summary>
77
/// Scope provider that does nothing.
88
/// </summary>
9-
internal class NullExternalScopeProvider : IExternalScopeProvider
9+
internal sealed class NullExternalScopeProvider : IExternalScopeProvider
1010
{
1111
private NullExternalScopeProvider()
1212
{

Tests/LinqToDB.EntityFrameworkCore.BaseTests/Logging/NullScope.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace LinqToDB.EntityFrameworkCore.BaseTests.Logging
44
{
5-
internal class NullScope : IDisposable
5+
internal sealed class NullScope : IDisposable
66
{
77
public static NullScope Instance { get; } = new NullScope();
88

Tests/LinqToDB.EntityFrameworkCore.BaseTests/Logging/TestLogger.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
namespace LinqToDB.EntityFrameworkCore.BaseTests.Logging
88
{
9-
internal class TestLogger : ILogger
9+
internal sealed class TestLogger : ILogger
1010
{
1111
private static readonly string _loglevelPadding = ": ";
1212
private static readonly string _messagePadding;
@@ -58,7 +58,7 @@ public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Except
5858
}
5959
}
6060

61-
public virtual void WriteMessage(LogLevel logLevel, string logName, int eventId, string message, Exception exception)
61+
public void WriteMessage(LogLevel logLevel, string logName, int eventId, string message, Exception exception)
6262
{
6363
var format = Options!.FormatterName;
6464
Debug.Assert(format is ConsoleFormatterNames.Simple or ConsoleFormatterNames.Systemd);
@@ -99,7 +99,7 @@ private void EnqueueMessage(LogMessageEntry entry)
9999
WriteMessage(entry);
100100
}
101101

102-
internal virtual void WriteMessage(LogMessageEntry message)
102+
internal void WriteMessage(LogMessageEntry message)
103103
{
104104
if (message.TimeStamp != null)
105105
{

Tests/LinqToDB.EntityFrameworkCore.PomeloMySql.Tests/LinqToDB.EntityFrameworkCore.PomeloMySql.Tests.csproj

+3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<Import Project="..\..\Build\linq2db.Tests.props" />
4+
<PropertyGroup>
5+
<NoWarn>CS8002</NoWarn>
6+
</PropertyGroup>
47

58
<ItemGroup>
69
<Compile Remove="Models\UniversalEntities\**" />

Tests/LinqToDB.EntityFrameworkCore.PostgreSQL.Tests/SampleTests/StringExtensions.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public static string ToSnakeCase(this string input)
1010
return input;
1111

1212
var startUnderscores = Regex.Match(input, @"^_+");
13-
return startUnderscores + Regex.Replace(input, @"([a-z0-9])([A-Z])", "$1_$2").ToLower();
13+
return startUnderscores + Regex.Replace(input, @"([a-z0-9])([A-Z])", "$1_$2").ToLowerInvariant();
1414
}
1515
}
1616
}

Tests/LinqToDB.EntityFrameworkCore.SqlServer.Tests/JsonConverTests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
6767
entity.Property(e => e.NameLocalized)
6868
.HasColumnName("NameLocalized_JSON")
6969
.HasConversion(v => JsonConvert.SerializeObject(v),
70-
v => JsonConvert.DeserializeObject<LocalizedString>(v));
70+
v => JsonConvert.DeserializeObject<LocalizedString>(v) ?? new());
7171
entity.Property(e => e.CrashEnum).HasColumnType("tinyint");
7272
entity.Property(e => e.GuidColumn).HasColumnType("uniqueidentifier");
7373
});

Tests/LinqToDB.EntityFrameworkCore.SqlServer.Tests/QueryableExtensions.cs

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Diagnostics.CodeAnalysis;
34
using System.Linq;
45
using System.Linq.Expressions;
56
using System.Threading;
@@ -70,7 +71,7 @@ public static IQueryable<T> FilterByProperties<T, TValue>(this IQueryable<T> que
7071
return query.Where(MakePropertiesPredicate<T, TValue>(pattern, searchValue, isOr));
7172
}
7273

73-
class ExpressionReplacer : ExpressionVisitor
74+
sealed class ExpressionReplacer : ExpressionVisitor
7475
{
7576
readonly IDictionary<Expression, Expression> _replaceMap;
7677

@@ -79,7 +80,8 @@ public ExpressionReplacer(IDictionary<Expression, Expression> replaceMap)
7980
_replaceMap = replaceMap ?? throw new ArgumentNullException(nameof(replaceMap));
8081
}
8182

82-
public override Expression Visit(Expression node)
83+
[return: NotNullIfNotNull("node")]
84+
public override Expression? Visit(Expression? node)
8385
{
8486
if (node != null && _replaceMap.TryGetValue(node, out var replacement))
8587
return replacement;

azure-pipelines.yml

+5-1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ stages:
3333

3434
steps:
3535

36+
- task: UseDotNet@2
37+
displayName: 'Use .NET 7'
38+
inputs:
39+
version: 7.x
40+
3641
- task: PowerShell@2
3742
inputs:
3843
filePath: '$(Build.SourcesDirectory)/Build/SetVersion.ps1'
@@ -96,7 +101,6 @@ stages:
96101
displayName: Publish to Azure Artifacts feed
97102
condition: and(succeeded(), eq(variables['Build.SourceBranchName'], 'version2'))
98103

99-
# apikey exires around 31/07/2020
100104
- task: NuGetCommand@2
101105
inputs:
102106
command: 'push'

linq2db.EFCore.sln

-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{A3F30061
1111
.gitignore = .gitignore
1212
azure-pipelines.yml = azure-pipelines.yml
1313
Directory.Packages.props = Directory.Packages.props
14-
global.json = global.json
1514
Build\linq2db.Default.props = Build\linq2db.Default.props
1615
Build\linq2db.snk = Build\linq2db.snk
1716
Build\linq2db.Tests.props = Build\linq2db.Tests.props

0 commit comments

Comments
 (0)