Uploaded image for project: 'OSAMES ORM'
  1. OSAMES ORM
  2. ORM-143

Méthodes intéressantes pour MappingTools

    XMLWordPrintable

    Details

    • Type: Improvement
    • Status: Closed
    • Priority: Blocker
    • Resolution: Incomplete
    • Affects Version/s: 0.1.0
    • Fix Version/s: None
    • Component/s: None
    • Labels:
      None
    • Environment:

      Je met en progress quant même.

      Description

      *** Méthodes ***

      Suite à ORM-139, de nouvelles idées (et on mettra à jour le webapp à ce moment-là) :

      On part du principe que la webapp, pour interroger l'ORM, ne connaît que des classes DbEntity et des noms de propriétés de ces classes.

      Il faut permettre à la webap d'interroger l'ORM pour obtenir un nom de colonne :

      • seul, non protégé ou protégé
      • préfixé du nom de la table, non protégé ou protégé. Sera utile pour formater des requêtes où préciser le nom de la table en plus de la colonne est indispensable (cas des JOIN).

      Interrogation en passant un DbEntity plutôt qu'un nom de table

      C'est une variante des méthodes existantes qui prennent ce paramètre : string mappingDictionaryName_.
      C'est pour simplifier la vie de l'utilisateur qui connaît ses objets mais pas par coeur leur valeur de décoration DatabaseMappingAttribute.

      Obtention du mapping complet

      La webapp doit aussi pouvoir demander le mapping pour un DbEntity donné, en une seule fois (obtention d'un dictionnaire).
      A ce moment-là, on remettra la méthode GetMappingDefinitionsForTable() en internal.
      Cette nouvelle méthode est en fait un appel à GetMappingDefinitionsForTable() en déterminant au préalable le nom de la table depuis le DbEntity paramètre.

      Supprimer ce qui a été fait dans MappingTools et prend des PropertyInfo en paramètre car cela est une vue de l'esprit idiote :
      - la webapp sait qu'on va travailler avec la propriété "FirstName" d'un Customer.
      - elle crée un PropertyInfo à partir de son Customer "toto" (son objet de travail "toto" a été créé au début de son traitement de la requête HTTP par Customer toto = new Customer();)
      - l'ORM analyse cette PropertyInfo et récupère "FirstName" et "Customer".

      Donc ici c'est exécuter du code pour "faire et défaire", la seule information transmise en plus de "FirstName" est "Customer" (nom de la classe de "toto" et nom de la table).

      Méthodes réellement intéressantes : demande d'un mapping complet en passant un DbEntity :

      • public List<KeyValuePair<string, string>> GetPropertyToColumnMapping<T>(T dbEntity_)
        • retourne une liste de couples noms de propriétés/colonnes, du style : FirstName -> first_name
      • public List<KeyValuePair<string, string>> GetProtectedPropertyToColumnMapping<T>(T dbEntity_)
        • retourne une liste de couples noms de propriétés/colonnes, avec colonnes protégées du style : FirstName -> [first_name]
      • public List<KeyValuePair<string, string>> GetPropertyToTableAndColumnMapping<T>(T dbEntity_)
        • retourne une liste de couples noms de propriétés/table et colonnes du style : FirstName -> customer.first_name
      • public List<KeyValuePair<string, string>> GetProtectedPropertyToTableAndColumnMapping<T>(T dbEntity_)
        • retourne une liste de couples noms de propriétés/table et colonnes, avec colonnes protégées du style : FirstName -> [customer].[first_name].

      Il faut voir si ces deux méthodes proposées ont un réel intérêt, car ici on ajoute de la réflexion : au lieu de passer la chaîne "Customer" on passe l'objet "toto" énoncé plus haut. L'ORM fait de la réflexion pour déterminer le nom de la classe de "toto". La réponse est oui, cela a un intérêt, car les méthodes de DbToolsUpdates par exemple travaillent comme cela, en ayant un DbEntity paramètre, donc la réflexion existe déjà à ce niveau. Elle permet aussi à la webapp d'ignorer le nom de la table en base de données de "toto", au fond ça ne l'intéresse absolument pas.

      *** Cache de données ***

      Actuellement nous avons des méthodes qui vont chercher dans le mapping, à l'aide des clés "nom de table" et "nom de propriété", une des quatre valeurs suivantes :

      • nom de colonne
      • nom de colonne protégée
      • nom de table, point, nom de colonne
      • nom de table, point, nom de colonne, chacune protégées

      Dans MappingTools, nous pouvons introduire un dictionnaire dont chaque "ligne de données" de 4 valeurs sera remplie au premier appel pour la clé donnée :

        Structure de la clé Valeur 0 Valeur 1 Valeur 2 Valeur 3
      Syntaxe nom complet du DbEntity#Nom de la propriété Colonne Colonne protégée Table.colonne Table protégée.colonne protégée
      Exemple My.Namespace.Customer#FirstName first_name [first_name] customer.first_name [customer].[first_name]

        Attachments

          Issue Links

            Activity

              People

              Assignee:
              babs Barbara Post
              Reporter:
              babs Barbara Post
              Watchers:
              2 Start watching this issue

                Dates

                Created:
                Updated:
                Resolved: