2009-05-15 4 views
0

J'ai une table avec la clé primaire avec _ (soulignement) dans son nom comme: User_Id. Lorsque SubSonic génère DAL, il supprime les traits de soulignement. Maintenant, je suis liant la collection d'objets à DropDownList comme suit:La colonne n'existe pas dans datasouruce problème lors de la liaison de la collection SubSonic à la liste déroulante

private void LoadCbo() 
{ 
    UserCollection users=(new UserCollection()).Load(); 
    User u=new User(){ 
     UserId=-1, 
     Name="[Select]"}; 
    users.Insert(0,u); 

    ddlUsers.DataSource=users; 
    ddlUsers.DataValueField=User.Columns.UserId; 
    ddlUsers.DataTextField=User.Columns.Name; 
    ddUsers.DataBind();  
} 

En cours d'exécution, il me dit que l'objet ne contient pas la colonne avec le nom « user_id ». PS: - L'utilisation de "UserId" fonctionne correctement. Je veux juste savoir si c'est un bug dans SubSonic (2.1) ou si je fais quelque chose de mal?

Répondre

1

Dans SubSonic 2.2, vous pouvez aussi le faire:

ddlUsers.DataValueField = User.UserIdColumn.PropertyName; 

De cette façon, vous pouvez éviter hardcoding les noms de colonnes dans votre code.

+0

Vous avez absolument raison, merci pour le rappel à ce sujet. –

+0

merci @ranmore c'est la bonne façon de procéder! – TheVillageIdiot

2

La collection Columns est composée des noms de colonne dans la base de données et non des noms de propriété de l'objet. Ce n'est pas un bug c'est un élément essentiel de la fonctionnalité sinon SubSonic n'aurait aucune connaissance sur la façon d'interroger la base de données actuelle.

La ligne suivante spécifie ce que la propriété à utiliser lors du remplissage de la valeur de la liste déroulante:

ddlUsers.DataValueField=User.Columns.UserId; 

La valeur de User.Columns.UserId sera « user_id », il est le nom de la colonne votre table de base de données, pas le nom de la propriété. Cependant, lorsque ddlUsers est une liaison de données, il ne peut pas trouver une propriété de l'objet User avec le nom User_Id car lorsque SubSonic génère votre DAL, il supprime le trait de soulignement du nom de la propriété. La meilleure solution est (comme l'a souligné ranomore):

ddlUsers.DataValueField = User.UserIdColumn.PropertyName; 
+0

@adam s'il vous plaît prêter attention à ps. "Je veux juste savoir si c'est un bug dans SubSonic (2.1) ou si je fais quelque chose de mal" ce que vous suggérez est écrit en question. Je sais déjà que spécifier le nom de la colonne sous forme de chaîne ("UserId") fait l'affaire. Comme je lie à l'objet Utilisateur (pas à la ligne de la base de données), Columns.UserId doit renvoyer le nom tel qu'il est dans les propriétés de l'objet et non ce qui est utilisé pour extraire et pousser les valeurs dans la base de données. Si SubSonic modifie les noms des colonnes, il doit prendre soin de donner des noms modifiés à l'objet extérieur et utiliser les noms de la table pour dialoguer avec DB. – TheVillageIdiot

+1

J'ai clarifié ma réponse afin de la rendre plus évidente. La collection Columns est là spécifiquement pour parler avec la base de données, elle doit donc renvoyer le nom de la base de données et non le nom de la propriété. En l'utilisant pour spécifier les propriétés de liaison de données, vous faites quelque chose de mal. –

+0

La réponse à la question dans le PS est: "Ce n'est pas un bug dans SubSonic.Vous faites quelque chose de mal." –

Questions connexes