27 votes

Mappage d'énumération à partir d'une chaîne

J'ai une colonne dans une table de base de données qui correspond à un Enum dans le code. Dans mon fichier dbml quand j'ai mis le "Type" de MyTypes.EnumType j'obtiens l'erreur suivante:

Erreur 1 DBML1005: le Mappage entre les DbType 'VarChar(50) not NULL" et Tapez " MyTypes.EnumType' dans la Colonne 'EnumCol' de Type 'Table1' n'est pas pris en charge.

Cette question: http://stackoverflow.com/questions/4939/linq-to-sql-strings-to-enums indique que ce que je suis en train de faire est possible, mais comment est-il fait?

34voto

Marc Gravell Points 482669

Curieux, il doit travailler IIRC; je vais voir si je peux faire un exemple rapide - cependant, vous pourriez vouloir vérifier que vous avez le complet enum nom (c'est à dire y compris l'espace de noms).

[mise à jour] à Partir d' ici, il semble que la version RTM livré avec un bug lors de la résolution de l'enum. Une solution de contournement proposé (sur cette page) a été d'ajouter de l' global:: préfixe. Il fonctionne très bien pour moi sans cette solution de contournement, il est peut-être corrigé dans la version 3.5 SP1? Il aurait également fonctionne bien dans les 3.5 si vous utilisez le nom non qualifié si l'enum est dans le même espace de noms.

[exemple] Yup, a bien fonctionné: avec les Comptoirs, j'ai défini un enum pour le pays d'expédition:

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

J'ai ensuite modifié le dbml avoir:

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

Cela a généré:

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

Et, enfin, a é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 bien fonctionné; les résultats:

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

17voto

Pure.Krome Points 28473

Je sais que cela a été répondu, mais je suis encore en train cette erreur également. Très bizarre.

De toute façon, j'ai trouvé une solution. Vous avez besoin d' AJOUTER de l'espace de nom complet de l'enum avec global::

comme WTF? Exactement. Je sais que cela semble très étrange. Voici un exemple screenie =>

alt text

Si boiteux :(

De toute façon, je n'ai pas le comprendre. Un mec appelé Matt, n'. Et il a posté un rapport de bug sur MS Connecter et ils ne peuvent pas repro-il si elle n'est pas fixée, je suppose.

De toute façon, HTH.

1voto

Manuel Castro Points 923

Si vous ajoutez le global :: qualyfier et appuyez sur Ctrl + espace sur le type dans le fichier designer.cs, il reconnaît le type 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