2012-10-31 1 views
0

je requête suivante (EF5, .NET4.5):L'utilisation énumérations à l'intérieur EF interroge

from p in repository 
select new Person() { 
    Name = p.Name, 
    Birthday = p.Birthday, 
    MyEnumValue = MyEnum.Value1 
}; 

MyEnumValue est ENUM défini comme:

public enum MyEnum : byte 
{ 
    Value1 = 1, 
    Value2 = 2 
} 

Lors de l'exécution de ce code provoquant l'exception:

La distribution spécifiée à partir d'un 'System.Byte' matérialisé ype au type 'MyApp.Domain.Models.MyEnum' n'est pas valide.

Mais si je change la définition enum

public enum MyEnum { ... } 

tout fonctionne très bien.

Est-il possible de corriger l'exception ne change pas MyEnum en int? (Et sans propriété octet supplémentaire :))

+0

Quelle est la colonne correspondante dans la base de données? Est-ce CodeFirst? – Pawel

+0

C'est DB-First. Il n'y a pas de colonne correspondante pour MyEnumValue. Je récupère l'objet 'p' (le type n'a pas d'importance) dans la base de données et crée un nouvel objet Person (les types Person et MyEnum ne sont pas inclus dans le modèle). – Andrey

+0

Je ne peux pas le reprocher. J'ai fait public enum TestEnum: byte {Test}; public class Test { public string Nom {obtenir; ensemble; } public TestEnum EnumValue {get; ensemble; }} class Program { static void Main (string [] args) { en utilisant (var = CTX nouvelles entités()) { var c = ctx.Countries.Select (a => nouveau test { Name = a.CountryName, EnumValue = TestEnum.Test}); Console.Write (c! = Null); } } } '. Qu'est-ce que je rate? – Pawel

Répondre

0

C'est MySQL Bug de connecteur .NET. Il n'y a donc qu'une seule option: contourner le problème et attendre la prochaine version.

-2

Essayez coulé comme ceci:

from p in repository 
select new Person() { 
    Name = p.Name, 
    Birthday = p.Birthday, 
    MyEnumValue = (MyEnum) Enum.Parse(typeof(MyEnum), MyEnum.Value1, true) 
}; 

si "MyEnumValue" champ de "personne" est un octet si jeté comme octet ...

+0

Cela ne va pas compiler.Et même avec "MyEnum.Value1.ToString(), true" cela ne fonctionnera pas. LINQ to Entities ne supporte pas Enum.Parse() – Andrey

+0

Pourquoi voulez-vous pirater comme ça? EF5 sur .NET Framework 4.5 prend en charge les énumérations et aucun piratage ne devrait être nécessaire. – Pawel

+0

devrait être;) Mais le code en question ci-dessus fonctionne lorsque enum est int32 seulement. – Andrey