Dapper ne pas renseigner les champs et lancer des exceptions

asp.net-mvc-3 dapper

Question

Je passe d'ActiveRecord à Dapper. J'ai une classe de projet simple avec quelques champs:

  • Id (int)
  • Nom (chaîne)
  • Secret (guid)
  • OwnerId (guid)

Ma première tentative d'utilisation de Dapper a abouti à ce code: j'utilise Dapper comme ça:

List<Project> projects = new List<Project>();
using (var conn = MvcApplication.GetSqlConnection()) // new connection
{
    projects = conn.Query<Project>("SELECT * FROM Projects p WHERE p.OwnerId = (SELECT UserId FROM aspnet_Users WHERE LoweredUserName=@userName)", new { userName = User.Identity.Name.ToLower() }).ToList();
}
return View(projects);

Cette requête a abouti à une DataException: Error parsing column 0 (Id=11 - Int16) . L'exception interne est une InvalidCastException: Specified cast is not valid.

Aucun des exemples de la page d'utilisation de Dapper ne mentionnant SELECT * , j'ai essayé de reformer ma requête comme suit:

    projects = conn.Query<Project>("SELECT OwnerId = (SELECT UserId FROM aspnet_Users WHERE LoweredUserName=@userName)", new { userName = User.Identity.Name.ToLower() }).ToList();

Lorsque je débogue, bien que je dispose de deux projets dans ma base de données, je n'en reçois qu'un seul; et celui-là a null pour un nom.

Étrange. Qu'est-ce que je fais mal? Je pense que Dapper ne mappe pas correctement les champs (DB) aux champs (classe). J'utilise la dernière version de NuGet.

Réponse acceptée

La différence que vous voyez est la caractéristique clé de la prochaine version (1.12?). Historiquement, Dapper a été très difficile à comprendre que les données doivent être une correspondance totale, et se plaindrait si, par exemple, les données sont doubles mais que le champ / la propriété est float, ou si les données sont longues et le champ / property int. . Dans la version en attente, il y a du code supplémentaire pour le détecter et compenser dans le cadre de l'IL généré (pas via Convert.ChangeType - trop lent).

Un facteur clé de ce changement est que certaines bases de données renvoient des valeurs assez simples de manières très différentes. Il était souvent problématique pour les utilisateurs de certaines bases de données de cartographier leurs types.

Tl; dr: Je suis content que la nouvelle fonctionnalité fonctionne pour vous. Il devrait être publié bientôt.


Réponse populaire

Dapper ne mappera que le résultat du SQL, vous devrez donc sélectionner dans la table que vous souhaitez qu'il mappe.

List<Project> projects = new List<Project>();
using (var conn = MvcApplication.GetSqlConnection()) // new connection
{
    projects = conn.Query<Project>("SELECT * FROM Projects Where OwnerId = (SELECT UserId FROM aspnet_Users WHERE LoweredUserName=@userName)", new { userName = User.Identity.Name.ToLower() }).ToList();
}
return View(projects);

Si




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi