Skip to content

Commit

Permalink
Merge pull request #234 from linq2db/version3
Browse files Browse the repository at this point in the history
Version 3.19.0
  • Loading branch information
sdanyliv authored May 30, 2022
2 parents c21b399 + 6b012ff commit 4c73ad0
Show file tree
Hide file tree
Showing 14 changed files with 139 additions and 137 deletions.
2 changes: 1 addition & 1 deletion Build/linq2db.Default.props
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<Project>
<PropertyGroup>
<Version>3.18.0</Version>
<Version>3.19.0</Version>

<Authors>Svyatoslav Danyliv, Igor Tkachev, Dmitry Lukashenko, Ilya Chudin</Authors>
<Product>Linq to DB</Product>
Expand Down
26 changes: 13 additions & 13 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
@@ -1,26 +1,26 @@
<Project>
<ItemGroup>
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="16.10.0" />
<PackageVersion Include="NUnit3TestAdapter" Version="4.0.0" />
<PackageVersion Include="NUnit" Version="3.13.2" />
<PackageVersion Include="FluentAssertions" Version="5.10.3" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.2.0" />
<PackageVersion Include="NUnit3TestAdapter" Version="4.2.1" />
<PackageVersion Include="NUnit" Version="3.13.3" />
<PackageVersion Include="FluentAssertions" Version="6.6.0" />

<PackageVersion Include="linq2db" Version="3.7.0" />
<PackageVersion Include="linq2db.Tools" Version="3.7.0" />
<PackageVersion Include="linq2db" Version="4.0.1" />
<PackageVersion Include="linq2db.Tools" Version="4.0.1" />

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


<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="3.1.6" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.InMemory" Version="3.1.6" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="3.1.25" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.InMemory" Version="3.1.25" />

<PackageVersion Include="Microsoft.Extensions.Logging" Version="5.0.0" />
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="5.0.0" />

<PackageVersion Include="Pomelo.EntityFrameworkCore.MySql" Version="3.2.4" />
<PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="3.1.4" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="3.1.15" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.10" />
<PackageVersion Include="Pomelo.EntityFrameworkCore.MySql" Version="3.2.7" />
<PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="3.1.18" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="3.1.25" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.25" />
</ItemGroup>
</Project>
7 changes: 6 additions & 1 deletion NuGet.config
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,9 @@
<add key="NuGet" value="https://api.nuget.org/v3/index.json" />
<add key="linq2db" value="https://pkgs.dev.azure.com/linq2db/linq2db/_packaging/linq2db/nuget/v3/index.json" />
</packageSources>
</configuration>
<packageSourceMapping>
<packageSource key="NuGet">
<package pattern="*" />
</packageSource>
</packageSourceMapping>
</configuration>
4 changes: 2 additions & 2 deletions NuGet/linq2db.EntityFrameworkCore.nuspec
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
<license type="file">MIT-LICENSE.txt</license>
<dependencies>
<group targetFramework=".NETStandard2.0">
<dependency id="Microsoft.EntityFrameworkCore.Relational" version="3.1.6" />
<dependency id="linq2db" version="3.7.0" />
<dependency id="Microsoft.EntityFrameworkCore.Relational" version="3.1.25" />
<dependency id="linq2db" version="4.0.1" />
</group>
</dependencies>
</metadata>
Expand Down
25 changes: 18 additions & 7 deletions Source/LinqToDB.EntityFrameworkCore/EFCoreMetadataReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,17 @@ public T[] GetAttributes<T>(Type type, MemberInfo memberInfo, bool inherit = tru
}
}

var behaviour = prop.GetBeforeSaveBehavior();
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
Expand All @@ -268,7 +279,9 @@ public T[] GetAttributes<T>(Type type, MemberInfo memberInfo, bool inherit = tru
IsPrimaryKey = isPrimaryKey,
PrimaryKeyOrder = primaryKeyOrder,
IsIdentity = isIdentity,
IsDiscriminator = discriminator == prop
IsDiscriminator = discriminator == prop,
SkipOnInsert = skipOnInsert,
SkipOnUpdate = skipOnUpdate
}
};
}
Expand Down Expand Up @@ -304,8 +317,7 @@ public T[] GetAttributes<T>(Type type, MemberInfo memberInfo, bool inherit = tru
{
ThisKey = thisKey,
OtherKey = otherKey,
CanBeNull = canBeNull,
IsBackReference = false
CanBeNull = canBeNull
});
}
else
Expand All @@ -316,8 +328,7 @@ public T[] GetAttributes<T>(Type type, MemberInfo memberInfo, bool inherit = tru
{
ThisKey = thisKey,
OtherKey = otherKey,
CanBeNull = !fk.IsRequired,
IsBackReference = true
CanBeNull = !fk.IsRequired
});
}
}
Expand Down Expand Up @@ -433,7 +444,7 @@ public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
if (obj.GetType() != GetType()) return false;
return Equals((SqlTransparentExpression) obj);
}

Expand Down Expand Up @@ -552,7 +563,7 @@ string PrepareExpressionText(Expression? expr)
if (expr is SqlFunctionExpression sqlFunction)
{
var text = sqlFunction.Name;
if (!sqlFunction.Schema.IsNullOrEmpty())
if (!string.IsNullOrEmpty(sqlFunction.Schema))
text = sqlFunction.Schema + "." + sqlFunction.Name;

if (!sqlFunction.IsNiladic)
Expand Down
16 changes: 8 additions & 8 deletions Source/LinqToDB.EntityFrameworkCore/LinqToDBExtensionsAdapter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -187,30 +187,30 @@ public Task<long> LongCountAsync<TSource>(
=> EntityFrameworkQueryableExtensions.LongCountAsync(source, predicate, token);

/// <inheritdoc cref="EntityFrameworkQueryableExtensions.MinAsync{TSource}(IQueryable{TSource}, CancellationToken)"/>
public Task<TSource> MinAsync<TSource>(
public Task<TSource?> MinAsync<TSource>(
IQueryable<TSource> source,
CancellationToken token)
=> EntityFrameworkQueryableExtensions.MinAsync(source, token);
=> EntityFrameworkQueryableExtensions.MinAsync(source, token)!;

/// <inheritdoc cref="EntityFrameworkQueryableExtensions.MinAsync{TSource, TResult}(IQueryable{TSource}, Expression{Func{TSource, TResult}}, CancellationToken)"/>
public Task<TResult> MinAsync<TSource,TResult>(
public Task<TResult?> MinAsync<TSource,TResult>(
IQueryable<TSource> source,
Expression<Func<TSource,TResult>> selector,
CancellationToken token)
=> EntityFrameworkQueryableExtensions.MinAsync(source, selector, token);
=> EntityFrameworkQueryableExtensions.MinAsync(source, selector, token)!;

/// <inheritdoc cref="EntityFrameworkQueryableExtensions.MaxAsync{TSource}(IQueryable{TSource}, CancellationToken)"/>
public Task<TSource> MaxAsync<TSource>(
public Task<TSource?> MaxAsync<TSource>(
IQueryable<TSource> source,
CancellationToken token)
=> EntityFrameworkQueryableExtensions.MaxAsync(source, token);
=> EntityFrameworkQueryableExtensions.MaxAsync(source, token)!;

/// <inheritdoc cref="EntityFrameworkQueryableExtensions.MaxAsync{TSource, TResult}(IQueryable{TSource}, Expression{Func{TSource, TResult}}, CancellationToken)"/>
public Task<TResult> MaxAsync<TSource,TResult>(
public Task<TResult?> MaxAsync<TSource,TResult>(
IQueryable<TSource> source,
Expression<Func<TSource,TResult>> selector,
CancellationToken token)
=> EntityFrameworkQueryableExtensions.MaxAsync(source, selector, token);
=> EntityFrameworkQueryableExtensions.MaxAsync(source, selector, token)!;

#region SumAsync

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -168,26 +168,26 @@ public static Task<long> LongCountAsyncLinqToDB<TSource>(
=> AsyncExtensions.LongCountAsync(source.ToLinqToDB(), predicate, token);

/// <inheritdoc cref="AsyncExtensions.MinAsync{TSource}(IQueryable{TSource}, CancellationToken)"/>
public static Task<TSource> MinAsyncLinqToDB<TSource>(
public static Task<TSource?> MinAsyncLinqToDB<TSource>(
this IQueryable<TSource> source,
CancellationToken token = default)
=> AsyncExtensions.MinAsync(source.ToLinqToDB(), token);

/// <inheritdoc cref="AsyncExtensions.MinAsync{TSource, TResult}(IQueryable{TSource}, Expression{Func{TSource, TResult}}, CancellationToken)"/>
public static Task<TResult> MinAsyncLinqToDB<TSource,TResult>(
public static Task<TResult?> MinAsyncLinqToDB<TSource,TResult>(
this IQueryable<TSource> source,
Expression<Func<TSource,TResult>> selector,
CancellationToken token = default)
=> AsyncExtensions.MinAsync(source.ToLinqToDB(), selector, token);

/// <inheritdoc cref="AsyncExtensions.MaxAsync{TSource}(IQueryable{TSource}, CancellationToken)"/>
public static Task<TSource> MaxAsyncLinqToDB<TSource>(
public static Task<TSource?> MaxAsyncLinqToDB<TSource>(
this IQueryable<TSource> source,
CancellationToken token = default)
=> AsyncExtensions.MaxAsync(source.ToLinqToDB(), token);

/// <inheritdoc cref="AsyncExtensions.MaxAsync{TSource, TResult}(IQueryable{TSource}, Expression{Func{TSource, TResult}}, CancellationToken)"/>
public static Task<TResult> MaxAsyncLinqToDB<TSource,TResult>(
public static Task<TResult?> MaxAsyncLinqToDB<TSource,TResult>(
this IQueryable<TSource> source,
Expression<Func<TSource,TResult>> selector,
CancellationToken token = default)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,13 @@ namespace LinqToDB.EntityFrameworkCore
using DataProvider;
using Linq;
using Expressions;
using LinqToDB.Interceptors;
using System.Data.Common;

/// <summary>
/// linq2db EF.Core data connection.
/// </summary>
public class LinqToDBForEFToolsDataConnection : DataConnection, IExpressionPreprocessor
public class LinqToDBForEFToolsDataConnection : DataConnection, IExpressionPreprocessor, IEntityServiceInterceptor
{
readonly IModel? _model;
readonly Func<Expression, IDataContext, DbContext?, IModel?, Expression>? _transformFunc;
Expand Down Expand Up @@ -67,7 +69,7 @@ public LinqToDBForEFToolsDataConnection(
_transformFunc = transformFunc;
CopyDatabaseProperties();
if (LinqToDBForEFTools.EnableChangeTracker)
OnEntityCreated += OnEntityCreatedHandler;
AddInterceptor(this);
}

/// <summary>
Expand All @@ -80,9 +82,9 @@ public LinqToDBForEFToolsDataConnection(
/// <param name="transformFunc">Expression converter.</param>
public LinqToDBForEFToolsDataConnection(
DbContext? context,
[NotNull] IDataProvider dataProvider,
[NotNull] IDbTransaction transaction,
IModel? model,
[NotNull] IDataProvider dataProvider,
[NotNull] DbTransaction transaction,
IModel? model,
Func<Expression, IDataContext, DbContext?, IModel?, Expression>? transformFunc
) : base(dataProvider, transaction)
{
Expand All @@ -91,7 +93,7 @@ public LinqToDBForEFToolsDataConnection(
_transformFunc = transformFunc;
CopyDatabaseProperties();
if (LinqToDBForEFTools.EnableChangeTracker)
OnEntityCreated += OnEntityCreatedHandler;
AddInterceptor(this);
}

/// <summary>
Expand All @@ -105,7 +107,7 @@ public LinqToDBForEFToolsDataConnection(
public LinqToDBForEFToolsDataConnection(
DbContext? context,
[NotNull] IDataProvider dataProvider,
[NotNull] IDbConnection connection,
[NotNull] DbConnection connection,
IModel? model,
Func<Expression, IDataContext, DbContext?, IModel?, Expression>? transformFunc) : base(dataProvider, connection)
{
Expand All @@ -114,7 +116,7 @@ public LinqToDBForEFToolsDataConnection(
_transformFunc = transformFunc;
CopyDatabaseProperties();
if (LinqToDBForEFTools.EnableChangeTracker)
OnEntityCreated += OnEntityCreatedHandler;
AddInterceptor(this);
}

/// <summary>
Expand Down Expand Up @@ -157,7 +159,7 @@ public override bool Equals(object? obj)
return true;
}

if (obj.GetType() != this.GetType())
if (obj.GetType() != GetType())
{
return false;
}
Expand All @@ -174,34 +176,34 @@ 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;
_lastEntityType = Context.Model.FindEntityType(type);
}

if (_lastEntityType == null)
return;
return entity;

// Do not allow to store in ChangeTracker tables that has different name
if (args.TableName != _lastEntityType.GetTableName())
return;
if (eventData.TableName != _lastEntityType.GetTableName())
return entity;

if (_stateManager == null)
_stateManager = Context.GetService<IStateManager>();
Expand All @@ -220,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);
entry = _stateManager.StartTrackingFromQuery(_lastEntityType, entity, ValueBuffer.Empty);
}

args.Entity = entry.Entity;
return entry.Entity;
}

private Func<IStateManager, object, InternalEntityEntry?>? CreateEntityRetrievalFunc(IEntityType entityType)
Expand Down
Loading

0 comments on commit 4c73ad0

Please sign in to comment.