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

Commit 24fc948

Browse files
authored
Merge pull request #152 from linq2db/master
Release 5.3.1
2 parents 24f688d + f5c6847 commit 24fc948

File tree

8 files changed

+149
-191
lines changed

8 files changed

+149
-191
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>5.3.0</Version>
3+
<Version>5.3.1</Version>
44

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

Source/LinqToDB.EntityFrameworkCore/EFCoreMetadataReader.cs

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using LinqToDB.Reflection;
1010
using Microsoft.EntityFrameworkCore;
1111
using Microsoft.EntityFrameworkCore.Diagnostics;
12+
using Microsoft.EntityFrameworkCore.Infrastructure;
1213
using Microsoft.EntityFrameworkCore.Metadata;
1314
using Microsoft.EntityFrameworkCore.Metadata.Internal;
1415
using Microsoft.EntityFrameworkCore.Query;
@@ -33,19 +34,21 @@ internal class EFCoreMetadataReader : IMetadataReader
3334
readonly IModel? _model;
3435
private readonly RelationalSqlTranslatingExpressionVisitorDependencies? _dependencies;
3536
private readonly IRelationalTypeMappingSource? _mappingSource;
36-
private readonly ConcurrentDictionary<MemberInfo, EFCoreExpressionAttribute?> _calculatedExtensions = new ConcurrentDictionary<MemberInfo, EFCoreExpressionAttribute?>();
37+
private readonly IRelationalAnnotationProvider? _annotationProvider;
38+
private readonly ConcurrentDictionary<MemberInfo, EFCoreExpressionAttribute?> _calculatedExtensions = new();
3739
private readonly IDiagnosticsLogger<DbLoggerCategory.Query>? _logger;
3840

3941
public EFCoreMetadataReader(
40-
IModel? model,
41-
RelationalSqlTranslatingExpressionVisitorDependencies? dependencies,
42-
IRelationalTypeMappingSource? mappingSource,
43-
IDiagnosticsLogger<DbLoggerCategory.Query>? logger)
42+
IModel? model, IInfrastructure<IServiceProvider>? accessor)
4443
{
4544
_model = model;
46-
_dependencies = dependencies;
47-
_mappingSource = mappingSource;
48-
_logger = logger;
45+
if (accessor != null)
46+
{
47+
_dependencies = accessor.GetService<RelationalSqlTranslatingExpressionVisitorDependencies>();
48+
_mappingSource = accessor.GetService<IRelationalTypeMappingSource>();
49+
_annotationProvider = accessor.GetService<IRelationalAnnotationProvider>();
50+
_logger = accessor.GetService<IDiagnosticsLogger<DbLoggerCategory.Query>>();
51+
}
4952
}
5053

5154
public T[] GetAttributes<T>(Type type, bool inherit = true) where T : Attribute
@@ -157,7 +160,17 @@ public T[] GetAttributes<T>(Type type, MemberInfo memberInfo, bool inherit = tru
157160
.FirstOrDefault(v => CompareProperty(v.p, memberInfo))?.index ?? 0;
158161
}
159162

160-
var isIdentity = prop.GetAnnotations()
163+
var storeObjectId = GetStoreObjectIdentifier(et);
164+
165+
var annotations = prop.GetAnnotations();
166+
if (_annotationProvider != null && storeObjectId != null)
167+
{
168+
var column = prop.FindColumn(storeObjectId.Value) as IColumn;
169+
if (column != null)
170+
annotations = annotations.Concat(_annotationProvider.For(column));
171+
}
172+
173+
var isIdentity = annotations
161174
.Any(a =>
162175
{
163176
if (a.Name.EndsWith(":ValueGenerationStrategy"))
@@ -178,8 +191,6 @@ public T[] GetAttributes<T>(Type type, MemberInfo memberInfo, bool inherit = tru
178191
return false;
179192
});
180193

181-
var storeObjectId = GetStoreObjectIdentifier(et);
182-
183194
return new T[]{(T)(Attribute) new ColumnAttribute
184195
{
185196
Name = prop.GetColumnName(storeObjectId!.Value),

Source/LinqToDB.EntityFrameworkCore/ILinqToDBForEFTools.cs

Lines changed: 27 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
1-
using System.Linq;
1+
using System;
2+
using System.Linq;
23
using System.Linq.Expressions;
34

45
using Microsoft.EntityFrameworkCore;
5-
using Microsoft.EntityFrameworkCore.Diagnostics;
66
using Microsoft.EntityFrameworkCore.Infrastructure;
77
using Microsoft.EntityFrameworkCore.Metadata;
8-
using Microsoft.EntityFrameworkCore.Query;
9-
using Microsoft.EntityFrameworkCore.Storage;
108
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
119
using Microsoft.Extensions.Logging;
1210

@@ -18,7 +16,7 @@ namespace LinqToDB.EntityFrameworkCore
1816
using Data;
1917

2018
/// <summary>
21-
/// Interface for EF.Core - LINQ To DB integration bridge.
19+
/// Interface for EF Core - LINQ To DB integration bridge.
2220
/// </summary>
2321
public interface ILinqToDBForEFTools
2422
{
@@ -28,81 +26,78 @@ public interface ILinqToDBForEFTools
2826
void ClearCaches();
2927

3028
/// <summary>
31-
/// Returns LINQ To DB provider, based on provider data from EF.Core.
29+
/// Returns LINQ To DB provider, based on provider data from EF Core.
3230
/// </summary>
33-
/// <param name="providerInfo">Provider information, extracted from EF.Core.</param>
31+
/// <param name="providerInfo">Provider information, extracted from EF Core.</param>
3432
/// <param name="connectionInfo">Database connection information.</param>
3533
/// <returns>LINQ TO DB provider instance.</returns>
3634
IDataProvider? GetDataProvider(EFProviderInfo providerInfo, EFConnectionInfo connectionInfo);
3735

3836
/// <summary>
39-
/// Creates metadata provider for specified EF.Core data model.
37+
/// Creates metadata provider for specified EF Core data model. Default implementation uses
38+
/// <see cref="EFCoreMetadataReader"/> metadata provider.
4039
/// </summary>
41-
/// <param name="model">EF.Core data model.</param>
42-
/// <param name="dependencies"></param>
43-
/// <param name="mappingSource"></param>
44-
/// <param name="logger"></param>
45-
/// <returns>LINQ To DB metadata provider for specified EF.Core model. Can return <c>null</c>.</returns>
40+
/// <param name="model">EF Core data model.</param>
41+
/// <param name="accessor">EF Core service provider.</param>
42+
/// <returns>LINQ To DB metadata provider for specified EF Core model.</returns>
4643
IMetadataReader? CreateMetadataReader(
4744
IModel? model,
48-
RelationalSqlTranslatingExpressionVisitorDependencies? dependencies,
49-
IRelationalTypeMappingSource? mappingSource,
50-
IDiagnosticsLogger<DbLoggerCategory.Query>? logger);
45+
IInfrastructure<IServiceProvider>? accessor);
5146

5247
/// <summary>
53-
/// Creates mapping schema using provided EF.Core data model and metadata provider.
48+
/// Creates mapping schema using provided EF Core data model and metadata provider.
5449
/// </summary>
55-
/// <param name="model">EF.Core data model.</param>
50+
/// <param name="model">EF Core data model.</param>
5651
/// <param name="metadataReader">Additional optional LINQ To DB database metadata provider.</param>
5752
/// <param name="convertorSelector">EF Core registry for type conversion.</param>
58-
/// <returns>Mapping schema for provided EF.Core model.</returns>
53+
/// <returns>Mapping schema for provided EF Core model.</returns>
5954
MappingSchema CreateMappingSchema(IModel model, IMetadataReader metadataReader, IValueConverterSelector convertorSelector);
6055

6156
/// <summary>
62-
/// Returns mapping schema using provided EF.Core data model and metadata provider.
57+
/// Returns mapping schema using provided EF Core data model and metadata provider.
6358
/// </summary>
64-
/// <param name="model">EF.Core data model.</param>
59+
/// <param name="model">EF Core data model.</param>
6560
/// <param name="metadataReader">Additional optional LINQ To DB database metadata provider.</param>
6661
/// <param name="convertorSelector">EF Core registry for type conversion.</param>
67-
/// <returns>Mapping schema for provided EF.Core model.</returns>
62+
/// <returns>Mapping schema for provided EF Core model.</returns>
6863
MappingSchema GetMappingSchema(IModel model, IMetadataReader? metadataReader, IValueConverterSelector? convertorSelector);
6964

7065
/// <summary>
71-
/// Returns EF.Core <see cref="IDbContextOptions"/> for specific <see cref="DbContext"/> instance.
66+
/// Returns EF Core <see cref="IDbContextOptions"/> for specific <see cref="DbContext"/> instance.
7267
/// </summary>
73-
/// <param name="context">EF.Core <see cref="DbContext"/> instance.</param>
68+
/// <param name="context">EF Core <see cref="DbContext"/> instance.</param>
7469
/// <returns><see cref="IDbContextOptions"/> instance.</returns>
7570
IDbContextOptions? GetContextOptions(DbContext? context);
7671

7772
/// <summary>
78-
/// Transforms EF.Core expression tree to LINQ To DB expression.
73+
/// Transforms EF Core expression tree to LINQ To DB expression.
7974
/// </summary>
80-
/// <param name="expression">EF.Core expression tree.</param>
75+
/// <param name="expression">EF Core expression tree.</param>
8176
/// <param name="dc">LINQ To DB <see cref="IDataContext"/> instance.</param>
8277
/// <param name="ctx">Optional DbContext instance.</param>
83-
/// <param name="model">EF.Core data model instance.</param>
78+
/// <param name="model">EF Core data model instance.</param>
8479
/// <returns>Transformed expression.</returns>
8580
Expression TransformExpression(Expression expression, IDataContext dc, DbContext? ctx, IModel? model);
8681

8782
/// <summary>
8883
/// Extracts <see cref="DbContext"/> instance from <see cref="IQueryable"/> object.
8984
/// </summary>
90-
/// <param name="query">EF.Core query.</param>
85+
/// <param name="query">EF Core query.</param>
9186
/// <returns>Current <see cref="DbContext"/> instance.</returns>
9287
DbContext? GetCurrentContext(IQueryable query);
9388

9489
/// <summary>
95-
/// Extracts EF.Core connection information object from <see cref="IDbContextOptions"/>.
90+
/// Extracts EF Core connection information object from <see cref="IDbContextOptions"/>.
9691
/// </summary>
9792
/// <param name="options"><see cref="IDbContextOptions"/> instance.</param>
98-
/// <returns>EF.Core connection data.</returns>
93+
/// <returns>EF Core connection data.</returns>
9994
EFConnectionInfo ExtractConnectionInfo(IDbContextOptions? options);
10095

10196
/// <summary>
102-
/// Extracts EF.Core data model instance from <see cref="IDbContextOptions"/>.
97+
/// Extracts EF Core data model instance from <see cref="IDbContextOptions"/>.
10398
/// </summary>
10499
/// <param name="options"><see cref="IDbContextOptions"/> instance.</param>
105-
/// <returns>EF.Core data model instance.</returns>
100+
/// <returns>EF Core data model instance.</returns>
106101
IModel? ExtractModel(IDbContextOptions? options);
107102

108103
/// <summary>

0 commit comments

Comments
 (0)