Dapper ne met pas en garde ou échoue avec des données manquantes

c#-4.0 dapper orm

Question

Disons que j'ai une classe (simpliste par exemple) et je veux m'assurer que le champ PersonId et Name est TOUJOURS rempli.

public class Person
{
    int PersonId { get; set; }
    string Name { get; set; }
    string Address { get; set; }
}

Actuellement ma requête serait

Person p = conn.Query<Person>("SELECT * FROM People");

Cependant, j'ai peut-être changé mon schéma de base de données de PersonId en PID et le code va maintenant passer sans problème.

Ce que je voudrais faire est l'un des suivants:

  1. Décorez la propriété PersonId avec un attribut tel que Required (que dapper peut valider)

  2. Dapper dit que les mappages ne sont pas complètement remplis

Est-ce possible actuellement? Si ce n'est pas le cas, est-ce que quelqu'un peut m'indiquer comment je pourrais le faire sans affecter trop la performance?

À mon humble avis , la deuxième option serait la meilleure car elle ne casserait pas le code existant pour les utilisateurs et ne nécessite pas plus de décoration d'attribut sur les classes auxquelles nous n'avons pas accès.

Réponse d'expert

Pour le moment, non, ce n'est pas possible. Et en effet, il y a beaucoup de cas où il est utile de remplir un modèle partiel, donc je ne voudrais rien ajouter d' implicite . Dans de nombreux cas, le modèle de domaine est une vue étendue du modèle de données, donc je ne pense pas que l’option 2 puisse fonctionner - et je sais qu’elle se décomposerait en un million de points dans mon code; p options ...

Jusqu'à présent, nous avons délibérément évité des choses comme des attributs; l'idée a été de rester aussi mince et directe que possible. Je ne suis pas pathologiquement opposé aux attributs - juste: cela peut être problématique de devoir les sonder. Mais peut-être est-il temps ... nous pourrions peut-être aussi permettre un mappage simple des colonnes en même temps, c.-à-d.

[Map(Name = "Person Id", Required = true)]
int PersonId { get; set; }

Name et Required sont facultatifs. Pensées? Cela pose problème à certains égards, cependant, en particulier pour le moment, nous ne recherchons que les colonnes que nous pouvons voir , en particulier dans l'API d'extensibilité.

L'autre possibilité est une interface que nous vérifions, vous permettant de vérifier manuellement les données après le chargement; par exemple:

public class Person : IMapCallback {
    void IMapCallback.BeforePopulate() {}
    void IMapCallback.AfterPopulate() {
        if(PersonId == 0)
            throw new InvalidOperationException("PersonId not populated");
    }
}

L'option d'interface me rend plus heureux à bien des égards:

  • cela évite beaucoup de palpage de réflexion supplémentaire (une seule vérification à faire)
  • il est plus flexible - vous pouvez choisir ce qui est important pour vous
  • cela n'affecte pas l'API d'extensibilité

mais: c'est plus manuel.

Je suis ouvert à vos commentaires, mais je veux m'assurer que tout se passe bien plutôt que de se précipiter dans toutes les armes à feu.




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