27 votes

Mapping Enum from String

J'ai une colonne de type chaîne dans une table de base de données qui correspond à un Enum dans le code. Dans mon fichier dbml, lorsque je donne à la colonne "Type" la valeur MyTypes.EnumType Je reçois l'erreur suivante :

Erreur 1 DBML1005 : Mapping between DbType 'VarChar(50) NOT NULL' and Type 'MyTypes.EnumType' dans la colonne 'EnumCol' du type 'Table1' n'est pas pris en charge supporté.

Cette question : LINQ to SQL strings to enums indique que ce que j'essaie de faire est possible, mais comment s'y prendre ?

34voto

Marc Gravell Points 482669

Curieux - cela devrait fonctionner IIRC ; je vais voir si je peux faire un exemple rapide - cependant, vous pourriez vouloir vérifier que vous avez le nom de l'enum entièrement qualifié (c'est-à-dire incluant l'espace de noms).

[mise à jour] De aquí il semble que la version RTM soit livrée avec un bug lors de la résolution de l'enum. Une solution de contournement suggérée (sur cette page) était d'ajouter l'élément global:: préfixe. Cela fonctionne bien pour moi sans cette solution de contournement, donc peut-être que le problème est corrigé dans la version 3.5 SP1 ? Cela fonctionne aussi prétendument bien dans 3.5 si vous utilisez le nom non qualifié si l'enum est dans le même espace de noms.

[Oui, cela a bien fonctionné : avec Northwind, j'ai défini un enum pour le pays de livraison :

namespace Foo.Bar
{
    public enum MyEnum
    {
        France,
        Belgium,
        Brazil,
        Switzerland
    }
}

J'ai ensuite édité le dbml pour avoir :

<Column Name="ShipCountry" Type="Foo.Bar.MyEnum" DbType="NVarChar(15)" CanBeNull="true" />

Ceci a été généré :

private Foo.Bar.MyEnum _ShipCountry;
//...
[Column(Storage="_ShipCountry", DbType="NVarChar(15)", CanBeNull=true)]
public Foo.Bar.MyEnum ShipCountry
{ get {...} set {...} }

Et j'ai finalement écrit une requête :

using (DataClasses1DataContext ctx = new DataClasses1DataContext())
{
    var qry = from order in ctx.Orders
              where order.ShipCountry == Foo.Bar.MyEnum.Brazil
                || order.ShipCountry == Foo.Bar.MyEnum.Belgium
              select order;
    foreach (var order in qry.Take(10))
    {
        Console.WriteLine("{0}, {1}", order.OrderID, order.ShipCountry);
    }
}

Ça a bien fonctionné ; résultats :

10250, Brazil
10252, Belgium
10253, Brazil
10256, Brazil
10261, Brazil
10287, Brazil
10290, Brazil
10291, Brazil
10292, Brazil
10299, Brazil

5 votes

J'ai dû ajouter "global: :" avec la version 3.5 SP1. Peut-être est-ce parce que j'ai changé l'espace de noms par défaut pour le DataContext (Project.Dal) et aussi pour les entités (Project.Dal.Entities) ?

17voto

Pure.Krome Points 28473

Je sais que cette question a déjà été traitée, mais j'obtiens toujours cette erreur. Très bizarre.

Enfin, j'ai trouvé une solution. Vous devez PRÉPENDRE l'espace de nom complet de l'enum avec global::

comme WTF ? Exactement. Je sais que ça semble très bizarre. Voici un exemple d'écran =>

texte alternatif http://img11.imageshack.us/img11/7517/lolzqg.png

C'est trop nul :(

Quoi qu'il en soit, je n'ai pas trouvé de solution. Un type qui s'appelle Matt l'a fait. Et il a posté un rapport de bogue sur MS Connect et ils ne peuvent pas le reproduire donc il n'est pas corrigé, je suppose.

Quoi qu'il en soit, HTH.

1 votes

Note rapide pour tous les utilisateurs de VB.NET, la syntaxe du type doit être "Global.<bien qualifié-enum-type>".

1 votes

Donc ce que tu dis, c'est "c'est un piège" ?

1 votes

Je le suis en effet ! Nous devons donner plus de temps à ces développeurs MS, concentrer tout le code sur ce projet Super Star !

1voto

Manuel Castro Points 923

Si vous ajoutez le qualificatif global: : et que vous appuyez sur Ctrl + espace sur le type dans le fichier designer.cs, le type est reconnu et vous pouvez le supprimer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X