The reference is an external enumeration type and contains a method

Since I switched to .net 4.5 and EF 5.0, I started using enumeration mapping. In my project, I first use the model. Since all the enumerations were declared earlier, so I decided on the user option "Reference external type" when I converted the fields to enums in EDM. Everything works fine, but when I try to execute code like

public enum SomeEnum : int { value1 = 0, value2 = 1 } class Program { static void Main(string[] args) { TestDbEntities context = new TestDbEntities(); var enumList = new List<SomeEnum>() { SomeEnum.value1, SomeEnum.value2 }; var items = context.Table1.Where(e => enumList.Contains(e.EnumField)); foreach (var item in items) { Console.Write(item.Id); } context.Dispose(); } } 

I get an ArgumentException message with the message:

 The type 'SomeEnum' does not match the EDM enumeration type 'SomeEnum' or its underlying type 'Int32' Parameter name: value. 

What is wired is that when I do not use a reference external type, everything is fine. I understand what is in EDM, but I can’t understand why this code works when the enumeration is defined in the model and later T4 is generated

  <EntityContainer Name="TestDbEntities" p1:LazyLoadingEnabled="true"> <EntitySet Name="Table1" EntityType="TestDbModel.Table1" /> </EntityContainer> <EntityType Name="Table1"> <Key> <PropertyRef Name="Id" /> <PropertyRef Name="EnumField" /> </Key> <Property Name="Id" Type="Int32" Nullable="false" /> <Property Name="EnumField" Type="TestDbModel.SomeEnum" Nullable="false" /> </EntityType> <EnumType Name="SomeEnum" a:ExternalTypeName="ConsoleApplication1.SomeEnum" xmlns:a="http://schemas.microsoft.com/ado/2006/04/codegeneration" /> 

I would like to use a reference external type, but this is a limitation. I know that I can use the base type, but it's a hack.

---- edit Here is the stack trace

 at System.Data.Common.CommandTrees.ExpressionBuilder.Internal.ArgumentValidation.ValidateConstant(TypeUsage constantType, Object value) at System.Data.Objects.ELinq.ExpressionConverter.ConstantTranslator.TypedTranslate(ExpressionConverter parent, ConstantExpression linq) at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) at System.Data.Objects.ELinq.ExpressionConverter.NewArrayInitTranslator.<>c__DisplayClass88.<TypedTranslate>b__86(Expression e) at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() at System.Data.Common.CommandTrees.ExpressionBuilder.Internal.EnumerableValidator`3.Validate(IEnumerable`1 argument, String argumentName, Int32 expectedElementCount, Boolean allowEmpty, Func`3 map, Func`2 collect, Func`3 deriveName) at System.Data.Common.CommandTrees.ExpressionBuilder.Internal.EnumerableValidator`3.Validate() at System.Data.Common.CommandTrees.ExpressionBuilder.Internal.ArgumentValidation.CreateExpressionList(IEnumerable`1 arguments, String argumentName, Boolean allowEmpty, Action`2 validationCallback) at System.Data.Common.CommandTrees.ExpressionBuilder.Internal.ArgumentValidation.ValidateNewCollection(IEnumerable`1 elements, DbExpressionList& validElements) at System.Data.Common.CommandTrees.ExpressionBuilder.DbExpressionBuilder.CreateNewCollection(IEnumerable`1 elements) at System.Data.Objects.ELinq.ExpressionConverter.NewArrayInitTranslator.TypedTranslate(ExpressionConverter parent, NewArrayExpression linq) at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) at System.Data.Objects.ELinq.ExpressionConverter.ConstantTranslator.TypedTranslate(ExpressionConverter parent, ConstantExpression linq) at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.ContainsTranslator.TranslateContains(ExpressionConverter parent, Expression sourceExpression, Expression valueExpression) at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.ContainsTranslator.Translate(ExpressionConverter parent, MethodCallExpression call) at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod) at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq) at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) at System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input) at System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input, DbExpressionBinding& binding) at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, DbExpression& source, DbExpressionBinding& sourceBinding, DbExpression& lambda) at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call) at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod) at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq) at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) at System.Data.Objects.ELinq.ExpressionConverter.Convert() at System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption) at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) at System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() at System.Data.Entity.Internal.Linq.InternalQuery`1.GetEnumerator() at System.Data.Entity.Infrastructure.DbQuery`1.System.Collections.Generic.IEnumerable<TResult>.GetEnumerator() at ConsoleApplication1.Program.Main(String[] args) in c:\Users\Pawel\Documents\Visual Studio 2012\Projects\ClassLibrary1\ConsoleApplication1\Program.cs:line 22 at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() 
+4
source share
2 answers

This is mistake. I submitted it to the EntityFramework Codeplex website: http://entityframework.codeplex.com/workitem/623 . Currently, a workaround is to either use || or specify all the members that you have in the CLR enumeration type in the EDM enumeration type. Setting the external enumeration type adds an annotation to the EDM enumeration type (a: ExternalTypeName = "ConsoleApplication1.SomeEnum"), which tells the code gene not to generate this type, but uses the attribute value everywhere in the generated code where this type is used. Without this annotation, a CLR enumeration that exactly matches the type of EDM enumeration will be displayed. Btw. I wrote a blogpost on EF5 and external enum types some time ago. You can find it here: http://blog.3d-logic.com/2012/09/11/using-exisiting-enum-types-in-entity-framework-5/ . I will add blog error information. Feel free to comment on this.

+4
source

Not a direct solution, but this workaround works for my requirements.

 var enumList = new List<int>() { (int)SomeEnum.value1, (int)SomeEnum.value2 }; var items = context.Table1.Where(e => enumList.Contains((int)e.EnumField)); 
+2
source

Source: https://habr.com/ru/post/1441793/


All Articles