Kimmax
Kimmax

Reputation: 1697

Application crashing under mono when using Linq

I'm programming a rest api using ServiceStack and EF6 (MySQL). The code runs without problems under windows and servicestack itself runs fine under linux (HyperfastCGI4 + Nginx).
However if I call a service which uses the EntityFramework I get a NotSupportedException and a stacktrace I don't really understand.
Is there something I missed?

Result of the request:

{
"ResponseStatus": {
"ErrorCode": "NotSupportedException",
"Message": "Operation is not supported.",
"StackTrace": "[Authenticate: 1/20/2016 4:34:10 PM]:  
[REQUEST: {UserName:[email protected],Password:******}]  
System.NotSupportedException: Operation is not supported.  
  at System.Reflection.MonoGenericClass.GetConstructors (BindingFlags bf) [0x00000] in <filename unknown>:0   
  at System.Reflection.TypeInfo.get_DeclaredConstructors () [0x00000] in <filename unknown>:0   
  at System.Data.Entity.Utilities.TypeExtensions.GetDeclaredConstructors (System.Type type) [0x00000] in <filename unknown>:0   
  at System.Data.Entity.Utilities.TypeExtensions.GetDeclaredConstructor (System.Type type, System.Type[] parameterTypes) [0x00000] in <filename unknown>:0   
  at System.Data.Entity.Core.Common.Internal.Materialization.CodeGenEmitter.CreateEntityWrapper (System.Linq.Expressions.Expression input, System.Linq.Expressions.Expression keyReader, System.Linq.Expressions.Expression entitySetReader, System.Type actualType, System.Type identityType, MergeOption mergeOption, Boolean isProxy) [0x00000] in <filename unknown>:0   
  at System.Data.Entity.Core.Common.Internal.Materialization.CodeGenEmitter.Emit_EnsureTypeAndWrap (System.Linq.Expressions.Expression input, System.Linq.Expressions.Expression keyReader, System.Linq.Expressions.Expression entitySetReader, System.Type requestedType, System.Type identityType, System.Type actualType, MergeOption mergeOption, Boolean isProxy) [0x00000] in <filename unknown>:0   
  at System.Data.Entity.Core.Common.Internal.Materialization.Translator+TranslatorVisitor.Emit_ConstructEntity (System.Data.Entity.Core.Metadata.Edm.EntityType oSpaceType, IEnumerable`1 propertyBindings, System.Linq.Expressions.Expression entityKeyReader, System.Linq.Expressions.Expression entitySetReader, TranslatorArg arg, System.Data.Entity.Core.Objects.Internal.EntityProxyTypeInfo proxyTypeInfo) [0x00000] in <filename unknown>:0   
  at System.Data.Entity.Core.Common.Internal.Materialization.Translator+TranslatorVisitor.Visit (System.Data.Entity.Core.Query.InternalTrees.EntityColumnMap columnMap, TranslatorArg arg) [0x00000] in <filename unknown>:0   
  at System.Data.Entity.Core.Query.InternalTrees.EntityColumnMap.Accept[TranslatorResult,TranslatorArg] (System.Data.Entity.Core.Query.InternalTrees.ColumnMapVisitorWithResults`2 visitor, TranslatorArg arg) [0x00000] in <filename unknown>:0   
  at System.Data.Entity.Core.Common.Internal.Materialization.Translator+TranslatorVisitor.ProcessCollectionColumnMap (System.Data.Entity.Core.Query.InternalTrees.CollectionColumnMap columnMap, TranslatorArg arg, System.Data.Entity.Core.Query.InternalTrees.ColumnMap discriminatorColumnMap, System.Object discriminatorValue) [0x00000] in <filename unknown>:0   
  at System.Data.Entity.Core.Common.Internal.Materialization.Translator+TranslatorVisitor.ProcessCollectionColumnMap (System.Data.Entity.Core.Query.InternalTrees.CollectionColumnMap columnMap, TranslatorArg arg) [0x00000] in <filename unknown>:0   
  at System.Data.Entity.Core.Common.Internal.Materialization.Translator+TranslatorVisitor.Visit (System.Data.Entity.Core.Query.InternalTrees.SimpleCollectionColumnMap columnMap, TranslatorArg arg) [0x00000] in <filename unknown>:0   
  at System.Data.Entity.Core.Query.InternalTrees.SimpleCollectionColumnMap.Accept[TranslatorResult,TranslatorArg] (System.Data.Entity.Core.Query.InternalTrees.ColumnMapVisitorWithResults`2 visitor, TranslatorArg arg) [0x00000] in <filename unknown>:0   
  at System.Data.Entity.Core.Common.Internal.Materialization.Translator.TranslateColumnMap[User] (System.Data.Entity.Core.Query.InternalTrees.ColumnMap columnMap, System.Data.Entity.Core.Metadata.Edm.MetadataWorkspace workspace, System.Data.Entity.Core.Objects.Internal.SpanIndex spanIndex, MergeOption mergeOption, Boolean streaming, Boolean valueLayer) [0x00000] in <filename unknown>:0   
  at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&)  
  at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00000] in <filename unknown>:0 ",
"Errors": []
}
}


Edit

I got rid of the error above by commenting out the Linq expression which receives some data from the database:

var userRow = modelContext.User.FirstOrDefault(user => user.Mail == mail);

I have found a method which calls a reflection method and returns an IQueryable inside the entityframework sources, however I don't know if this has to do with the problem. At least it lead me in the right direction.
Here is the implementation:

/// <summary>
///     Creates an appropriate generic IQueryable using Reflection and the underlying ElementType of
///     the given ObjectQuery.
/// </summary>
private IQueryable CreateQuery(ObjectQuery objectQuery)
{
    var internalQuery = CreateInternalQuery(objectQuery);

    var genericDbQueryType = typeof(InternalDbQuery<>).MakeGenericType(internalQuery.ElementType);
    var constructor = genericDbQueryType.GetConstructors(BindingFlags.Instance | BindingFlags.Public).Single();
    return (IQueryable)constructor.Invoke(new object[] { internalQuery });
}

Could Linq cause the mono trouble and if yes, is there a way to fix it?

Upvotes: 0

Views: 242

Answers (1)

Kimmax
Kimmax

Reputation: 1697

Re-targeting at 3.5 fixed the problem
Grrr
Also Update-Package -reinstall does reinstall all nugets for you

Upvotes: 2

Related Questions