Bug #92987 | Entity Framework crashing when using linq Any() method | ||
---|---|---|---|
Submitted: | 29 Oct 2018 12:57 | Modified: | 27 May 2019 10:25 |
Reporter: | Manuel Zulian | Email Updates: | |
Status: | Verified | Impact on me: | |
Category: | Connector / NET | Severity: | S3 (Non-critical) |
Version: | 8.0.13, 8.0.16 | OS: | Windows |
Assigned to: | CPU Architecture: | x86 | |
Tags: | ANY, EF, linq |
[29 Oct 2018 12:57]
Manuel Zulian
[3 Nov 2018 17:40]
Bradley Grainger
Are you trying to map a BIT(1) column to bool? If so, see my comment on bug #93028.
[3 Nov 2018 17:42]
Manuel Zulian
No, it's TINYINT(1).
[13 Nov 2018 18:15]
Oliver Hall
I'm hitting the same issue, though I'm not creating any code myself. I'm using migrations to add ASP.Net Identity to a MySQL schema. [System.InvalidOperationException: No coercion operator is defined between types 'System.Int16' and 'System.Boolean'.] The MySQL datatype for the generated tables is BIT(1) for all boolean properties (none of which are nullable) and I'm calling UserManager.FindByEmailAsync(...) which in turn calls Linq. I can't see where the Int16 is coming from at all. Apologies if I'm missing something obvious, or there's an easy way to add user-defined coercion, but I'm pretty new to Entity Framework. Unfortunately, this is blocking further progress for me.
[12 Dec 2018 15:30]
Andrew Furniss
I am also experiencing this issue since upgrading to MySQL Server 8 from 5.7. I'm on Windows and using MySQL.Data.EntityFrameworkCore 8.0.13 nuget package within a .NET Core Web API application.
[2 Apr 2019 8:30]
Marcos Gomes
Hi, I've notice that on MySQLTypeMapper if we change the _bit mapping to something like this: private readonly RelationalTypeMapping _bit = new MySQLNumberTypeMapping("bit", typeof(bool), DbType.Boolean); Ir resolves the error. O hope the dev team could look at that. Thanks
[10 May 2019 13:03]
Jo kjhjkh
I have the same issue, It's weird where, select etc is working except any()... I'm using connector/framework core 8.0.16. My server also is running on 8.0.16 My type in the database is : tinyint(1) Here is my model [Column(TypeName = "TINYINT(1)")] public bool deleted { get; set; } And I got this error using Any No coercion operator is defined between types 'System.Int16' and 'System.Boolean'.
[10 May 2019 13:05]
Jo kjhjkh
Here is my call when it crash var users = dbContext.user.Any(x => !x.deleted);
[10 May 2019 13:07]
Jo kjhjkh
at System.Linq.Expressions.Expression.GetUserDefinedCoercionOrThrow(ExpressionType coercionType, Expression expression, Type convertToType) at System.Linq.Expressions.Expression.Convert(Expression expression, Type type, MethodInfo method) at System.Linq.Expressions.Expression.Convert(Expression expression, Type type) at Microsoft.EntityFrameworkCore.Storage.TypedRelationalValueBufferFactoryFactory.CreateGetValueExpression(Expression dataReaderExpression, Int32 index, TypeMaterializationInfo materializationInfo, Boolean detailedErrorsEnabled, Boolean box) at Microsoft.EntityFrameworkCore.Storage.TypedRelationalValueBufferFactoryFactory.<>c__DisplayClass13_0.<CreateArrayInitializer>b__0(TypeMaterializationInfo mi, Int32 i) at System.Linq.Enumerable.SelectIterator[TSource,TResult](IEnumerable`1 source, Func`3 selector)+MoveNext() at System.Collections.Generic.LargeArrayBuilder`1.AddRange(IEnumerable`1 items) at System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable`1 source) at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source) at System.Dynamic.Utils.CollectionExtensions.ToReadOnly[T](IEnumerable`1 enumerable) at System.Linq.Expressions.Expression.NewArrayInit(Type type, IEnumerable`1 initializers) at Microsoft.EntityFrameworkCore.Storage.TypedRelationalValueBufferFactoryFactory.CreateArrayInitializer(CacheKey cacheKey, Boolean detailedErrorsEnabled) at Microsoft.EntityFrameworkCore.Storage.TypedRelationalValueBufferFactoryFactory.<Create>b__11_0(CacheKey k) at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory) at Microsoft.EntityFrameworkCore.Storage.TypedRelationalValueBufferFactoryFactory.Create(IReadOnlyList`1 types) at Microsoft.EntityFrameworkCore.Query.Sql.DefaultQuerySqlGenerator.CreateValueBufferFactory(IRelationalValueBufferFactoryFactory relationalValueBufferFactoryFactory, DbDataReader dataReader) at Microsoft.EntityFrameworkCore.Query.Internal.ShaperCommandContext.<NotifyReaderCreated>b__14_0(FactoryAndReader s) at Microsoft.EntityFrameworkCore.Internal.NonCapturingLazyInitializer.EnsureInitialized[TParam,TValue](TValue& target, TParam param, Func`2 valueFactory) at Microsoft.EntityFrameworkCore.Query.Internal.ShaperCommandContext.NotifyReaderCreated(DbDataReader dataReader) at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.BufferlessMoveNext(DbContext _, Boolean buffer) at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.MoveNext() at Microsoft.EntityFrameworkCore.Query.QueryMethodProvider.GetResult[TResult](IEnumerable`1 valueBuffers, Boolean throwOnNullResult) at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ResultEnumerable`1.GetEnumerator() at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.MoveNext() at System.Linq.Enumerable.TryGetFirst[TSource](IEnumerable`1 source, Boolean& found) at System.Linq.Enumerable.First[TSource](IEnumerable`1 source) at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass15_1`1.<CompileQueryCore>b__0(QueryContext qc) at System.Linq.Queryable.Any[TSource](IQueryable`1 source, Expression`1 predicate) at test.Controllers.UserController.Get(UInt32 id) in F:\Documents\test\fdet.backend\Controllers\UserController.cs:line 92
[27 May 2019 10:25]
MySQL Verification Team
Hello Manuel Zulian, Thank you for the report. Verified as described with VS 2019, C/NET 8.0.16 on Win10. regards, Umesh
[29 Jun 2019 9:59]
Kok How Teh
Any ETA for the fix?
[3 Jul 2019 10:33]
Luca Graziani
Hi, I've same problem with IQueryable<T>.Any call. In my specific case I've extended identity framework to support client management. This is my stack trace: System.InvalidOperationException: No coercion operator is defined between types 'System.Int16' and 'System.Boolean'. at System.Linq.Expressions.Expression.GetUserDefinedCoercionOrThrow(ExpressionType coercionType, Expression expression, Type convertToType) at System.Linq.Expressions.Expression.Convert(Expression expression, Type type, MethodInfo method) at System.Linq.Expressions.Expression.Convert(Expression expression, Type type) at Microsoft.EntityFrameworkCore.Storage.TypedRelationalValueBufferFactoryFactory.CreateGetValueExpression(Expression dataReaderExpression, Int32 index, TypeMaterializationInfo materializationInfo, Boolean detailedErrorsEnabled, Boolean box) at Microsoft.EntityFrameworkCore.Storage.TypedRelationalValueBufferFactoryFactory.<>c__DisplayClass13_0.<CreateArrayInitializer>b__0(TypeMaterializationInfo mi, Int32 i) at System.Linq.Enumerable.SelectIterator[TSource,TResult](IEnumerable`1 source, Func`3 selector)+MoveNext() at System.Collections.Generic.LargeArrayBuilder`1.AddRange(IEnumerable`1 items) at System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable`1 source) at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source) at System.Dynamic.Utils.CollectionExtensions.ToReadOnly[T](IEnumerable`1 enumerable) at System.Linq.Expressions.Expression.NewArrayInit(Type type, IEnumerable`1 initializers) at Microsoft.EntityFrameworkCore.Storage.TypedRelationalValueBufferFactoryFactory.CreateArrayInitializer(CacheKey cacheKey, Boolean detailedErrorsEnabled) at Microsoft.EntityFrameworkCore.Storage.TypedRelationalValueBufferFactoryFactory.<Create>b__11_0(CacheKey k) at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory) at Microsoft.EntityFrameworkCore.Storage.TypedRelationalValueBufferFactoryFactory.Create(IReadOnlyList`1 types) at Microsoft.EntityFrameworkCore.Query.Sql.DefaultQuerySqlGenerator.CreateValueBufferFactory(IRelationalValueBufferFactoryFactory relationalValueBufferFactoryFactory, DbDataReader dataReader) at Microsoft.EntityFrameworkCore.Query.Internal.ShaperCommandContext.<NotifyReaderCreated>b__14_0(FactoryAndReader s) at Microsoft.EntityFrameworkCore.Internal.NonCapturingLazyInitializer.EnsureInitialized[TParam,TValue](TValue& target, TParam param, Func`2 valueFactory) at Microsoft.EntityFrameworkCore.Query.Internal.ShaperCommandContext.NotifyReaderCreated(DbDataReader dataReader) at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.BufferlessMoveNext(DbContext _, Boolean buffer) at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.MoveNext() at Microsoft.EntityFrameworkCore.Query.QueryMethodProvider.GetResult[TResult](IEnumerable`1 valueBuffers, Boolean throwOnNullResult) at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ResultEnumerable`1.GetEnumerator() at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.MoveNext() at System.Linq.Enumerable.TryGetFirst[TSource](IEnumerable`1 source, Boolean& found) at System.Linq.Enumerable.First[TSource](IEnumerable`1 source) at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass15_1`1.<CompileQueryCore>b__0(QueryContext qc) at System.Linq.Queryable.Any[TSource](IQueryable`1 source, Expression`1 predicate) at Common.IdentityServerRepository.MySQL.MyClientManager.ExistsAsync(String clientId) in C:\Users\Developer\Documents\Visual Studio 2019\Projects\Test\Common.IdentityServerRepository.MySQL\MyClientManager.cs:line 37 at Membership.Web.Controllers.HomeController.Index() in C:\Users\Developer\Documents\Visual Studio 2019\Projects\Test\Membership.Web\Controllers\HomeController.cs:line 23 at Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments) at System.Threading.Tasks.ValueTask`1.get_Result() at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync() at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync() at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context) at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync() at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter() at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context) at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync() at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync() at Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext) at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
[3 Jul 2019 10:45]
Luca Graziani
Test Application with issue
Attachment: Test.zip (application/x-zip-compressed, text), 613.65 KiB.
[17 Jul 2019 7:34]
MySQL Verification Team
Bug #96228 marked as duplicate of this one
[13 Oct 2019 12:54]
Enrique Penabella
I also found this to be an issue using linq 'Any()' I switched to 'FirstOrDefault() is null' instead unfortunately and it worked :)
[29 Jan 2020 7:24]
Luca Graziani
Hi! As Enrique Penabella I've created a simple extension method to trace the existence of item. This is the code: public static class ExistsExtension { public static bool Exists<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate) { if (source.FirstOrDefault(predicate) == null) return false; return true; } } It's a simple workaround, but works well :D.