EF4.3.1 sur .NET 4 - La cartographie de type CLR pour EDM type est ambigu, car plusieurs types CLR match de l'EDM type
Mise à jour: Sujet mis à jour - c'est maintenant reproductible sur EF 4.3.1 sous .NET 4 en cours d'exécution avec VS2012 installé sous Windows 8. Des idées pourquoi ce serait se passe maintenant?
Le sujet dit tout, vraiment. Nous avons juste mis à niveau à partir EF 4.3 code-première à EF 5 fonctionnant sous .NET 4.0. Nous avons une requête qui ressemble à la suivante:
ctx.Set<Entities.A>().Select(a => new DTO.A { Id = a.Id, Name = a.Name }).ToArray();
Entities.A
est définie dans un ensemble appelé Entities
et DTO.A
est définie dans un ensemble appelé DTO
. En EF 4.3 cela a bien fonctionné, mais en vertu de l'EF 5.0, il jette l'exception suivante:
Schema specified is not valid. Errors:
The mapping of CLR type to EDM type is ambiguous because multiple CLR types match the EDM type 'A'. Previously found CLR type 'Entities.A', newly found CLR type 'DTO.A'.
Trace de la pile est
at System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyFromCache(ObjectItemCollection objectItemCollection, Assembly assembly, Boolean loadReferencedAssemblies, EdmItemCollection edmItemCollection, Action'1 logLoadMessage)
at System.Data.Metadata.Edm.ObjectItemCollection.ImplicitLoadAssemblyForType(Type type, EdmItemCollection edmItemCollection)
at System.Data.Metadata.Edm.MetadataWorkspace.ImplicitLoadAssemblyForType(Type type, Assembly callingAssembly)
at System.Data.Objects.ELinq.ExpressionConverter.TryGetValueLayerType(Type linqType, TypeUsage& type)
at System.Data.Objects.ELinq.ExpressionConverter.GetCastTargetType(TypeUsage fromType, Type toClrType, Type fromClrType, Boolean preserveCastForDateTime)
at System.Data.Objects.ELinq.ExpressionConverter.CreateCastExpression(DbExpression source, Type toClrType, Type fromClrType)
at System.Data.Objects.ELinq.ExpressionConverter.ConvertTranslator.TranslateUnary(ExpressionConverter parent, UnaryExpression unary, DbExpression operand)
at System.Data.Objects.ELinq.ExpressionConverter.UnaryTranslator.TypedTranslate(ExpressionConverter parent, UnaryExpression 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.UnaryTranslator.TypedTranslate(ExpressionConverter parent, UnaryExpression 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.MemberInitTranslator.TypedTranslate(ExpressionConverter parent, MemberInitExpression 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.SelectTranslator.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.MemberInitTranslator.TypedTranslate(ExpressionConverter parent, MemberInitExpression 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.SelectTranslator.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.TranslateSet(Expression linq)
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.UnarySequenceMethodTranslator.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)
J'aimerais comprendre le problème si les types ont été dans la même assemblée (un long problème documenté avec EF en vertu de laquelle il ne peut pas lever l'ambiguïté en utilisant simplement le nom de l'entité), mais à partir d'un assemblage différent?
Des idées où aller à partir d'ici? Je ne vois aucune façon de dire EF efficacement mépris de la DTO de l'assemblée et je devine expression de requête de génération nécessite la connaissance de la DTO, afin de projeter les résultats dans le droit chose à la matérialisation.
Grâce,
Dean
- Juste pour vous donner une mise à jour sur qui - nous envisageons un correctif pour résoudre ce dans une des prochaines mises à jour, où ne serait pas levée pour v1 ou v2 schémas. De la même façon sur EF6, nous n'aurions pas essayer de charger l'assembly référencé si le schéma est v1 ou v2 puisqu'il n'est pas nécessaire et il est coûteux. Juste pour la référence, le bug que nous utilisons pour suivre cette pour EF6 - entityframework.codeplex.com/workitem/596 (je pense que vous êtes familier avec celui-ci 😉
- Merci Pawel. Dans ce projet particulier, nous sommes actuellement à la mise à niveau .NET 4.5, alors nous avons mis en place d'autres solutions de contournement, cependant, cela va certainement nous aider dans d'autres endroits ont été nous ne sommes pas de la mise à niveau à 4,5 dans un avenir proche!
Vous devez vous connecter pour publier un commentaire.
Je crois que j'ai au fond de lui aujourd'hui.
Il me semble que le type enum vie dans un ensemble distinct et le casting déclenche le chargement des types de cette assemblée. Cette assemblée qui arrive à contenir le type " DTO.Un "qui correspond à la "Entités".Un' type. Cette cause de l'ambiguïté qui à son tour provoque la levée d'une exception. Remarque qui n'est pas arrivé en .NET Framework 4 depuis les types enum dans EF4 n'ont pas été pris en charge et l'opération de cast n'est pas la cause du chargement de types de l'autre assemblée, donc des projets qui visent .NET Framework 4 c'est une régression .NET Framework 4.5.
Dans EF6, le comportement sera le même quel que soit .NET Framework version - nous toujours de lancer.
Doyen,
C'est un problème connu, comme indiqué dans les liens suivants:
http://entityframework.codeplex.com/workitem/483
http://entityframework.codeplex.com/workitem/589
L'espace de noms est ignoré par l'Entité Cadre de sorte que les mêmes tables dans de multiples bases de données à l'origine du problème, parce que l'Entité Cadre ne regarde que le nom de la table.
Apparemment, l'équipe d'Entity Framework ne pas comprendre l'importance de soutenir tout ce schéma de base de données clients. Ils ont aussi perdu de vue le fait que le propre de la compilation de code devrait également fonctionner.
Si vous regardez les liens que j'ai mentionné ci-dessus, vous verrez que la correction de leurs erreurs, qui ont une faible priorité. Je ne sais pas vous, mais je serais tiré au cours de cette attitude.