2010-02-05 9 views
0

Lors de l'enregistrement d'une ligne dotée d'une clé primaire integere, l'exception suivante est lancée dans la version VB: 'Membre public' ChangeTypeTo 'sur le type' Décimal 'non trouvé.'Problème de moulage dans SubSonic 3

Cela se produit dans la ligne de fichier ActiveRecord.VB 3406:

 Public Sub SetKeyValue(value As Object) Implements IActiveRecord.SetKeyValue 
     If value IsNot Nothing AndAlso value IsNot DBNull.Value Then 
      Dim settable = value.ChangeTypeTo(Of Integer)() 

je peux changer la dernière ligne:

Dim settable = CInt(value) 'value.ChangeTypeTo(Of Integer)() 

Cela va corriger le problème jusqu'à ce que je recompile les fichiers .tt.

Ma question est, comment puis-je changer cela dans le fichier ActiveRecord.tt? Le code dans le fichier tt ressemble à ceci:

Dim settable = value.ChangeTypeTo(Of <#=tbl.PK.SysType#>)() 

Toute aide est appréciée.

Merci

Répondre

1

J'ai également eu divers problèmes avec les modèles VB. Cela semble être l'objectif des développeurs de Subsonic en C#. Enfin, je choisis d'utiliser les modèles C# dans un autre projet, et de le référencer à partir de mon application principale VB. Le problème avec le changement que vous essayez de faire est que vous essayez de remplacer une méthode générique par une méthode concrète, ce n'est pas le meilleur. <#=tbl.PK.SysType#> fait référence au type de la clé primaire. Si vous avez uniquement des clés primaires entières, vous pouvez modifier le modèle en tant que Dim settable = CInt(value). Sinon, vous avez besoin de GetType pour connaître le type de value, puis un select case avec la conversion apropiate pour chaque type qui arrive à la méthode.

+0

La partie intesting du code incorrect, cependant, est que votre clé primaire entière en Decimal. Pourquoi ne pas chercher à revenir? – Apocatastasis

+0

Merci de votre contribution. Vous aviez raison, il semble y avoir des problèmes avec les modèles VB. J'ai fait comme vous l'avez suggéré, j'ai ajouté un projet de bibliothèque de classe C# à ma solution et j'ai utilisé les modèles C#. J'ai changé ma référence (j'avais aussi les templates VB dans un projet séparé) pour le projet C# et maintenant ça fonctionne parfaitement. Merci encore. gm –

0

Le code généré est correct. Vous essayez de convertir une valeur décimale en entier, cela n'a aucun sens. Pour modifier les modèles n'est pas la solution dans ce cas, vous devez corriger la logique de votre application.

+0

Merci de répondre à ma question, cependant, je n'utilise pas de décimales. La valeur est l'Id qui est retourné après une insertion. La base de données (SQL 2005) définit la clé comme Int, Subsonic activeRecord possède la propriété ID comme Integer, mais dans Sub SetKeyValue (le Sub que vous pouvez voir dans le code ci-dessus), la valeur est un Decimal. Encore une fois, il insère l'enregistrement et quand il renvoie le nouvel ID (clé primaire) l'exception se produit. voici ce que je fais dans mon code: Cust = New BV.bv_Customer copyTextboxesToCust() Cust.Save() Tous les conseils que je fait de mal? Merci gm –