1

Je suis en train de cartographier la configuration du tableau ci-dessous, dont je ne contrôle pas (désolé pour les tables de texte, je ne peux pas poster encore d'images):Cartographie verticale héritage Table avec Fluent NHibernate

**METADATA** 
METADATA_ID NUMBER(10,0) 
METADATA_DICT_ID NUMBER(10,0) 
SAMPLE_ID NUMBER(10,0) 
CREATED_BY NUMBER(10,0) 
CREATE_DATE DATE 
REQUIRED VARCHAR2(9 BYTE) 
METADATA_VALUE VARCHAR2(300 BYTE) 
METADATA_LARGE_VALUE CLOB 

**METADATA_DICT** 
METADATA_DICT_ID NUMBER(10,0) 
METADATA_DICT_TYPE_ID NUMBER(10,0) 
METADATA_DICT_NM VARCHAR2(60 BYTE) 
DESCRIPTION VARCHAR2(512 BYTE) 
CREATE_DATE DATE 
CREATED_BY VARCHAR2(20 BYTE) 


**SAMPLES** 
METADATA_DICT_ID NUMBER(10,0) 
METADATA_DICT_TYPE_ID NUMBER(10,0) 
METADATA_DICT_NM VARCHAR2(60 BYTE) 
DESCRIPTION VARCHAR2(512 BYTE) 
CREATE_DATE DATE 
CREATED_BY VARCHAR2(20 BYTE) 

Fondamentalement, un échantillon a une collection d'attributs de métadonnées, dont chacun est une paire clé/valeur (avec un peu de gotcha, en ce sens que la valeur peut être soit dans une colonne CLOB, soit dans une colonne varchar2, selon sa taille). Chaque clé de paire clé/valeur correspond à un type d'informations collectées (METADATA_DICT_ID), tandis que la clé correspond à une valeur fournie par l'utilisateur (METADATA_VALUE/METADATA_LARGE_VALUE). Un utilisateur pourrait être invité à entrer 'Type de plasmide', et il répondrait 'Source Clone', par exemple. La raison pour cela était qu'un utilisateur peut ajouter dynamiquement de nouveaux types d'informations (questions) à collecter sur les échantillons en définissant de nouveaux types de métadonnées. Cela fonctionne plutôt bien pour leurs besoins, mais je veux créer un modèle de domaine maintenant pour une application ASP.NET MVC, et je veux remplir ce modèle de domaine avec NHibernate.

Il semble qu'il y ait plusieurs façons d'aborder cela. En fin de compte, je veux que les données contenues dans la structure suivante:

public class ProteinSample : PersistentObject 
    { 
     public virtual SampleType SampleType { get; set; } 
     public virtual Project Project { get; set; } 
     public virtual long Variant { get; set; } 
     public virtual DateTime CreationDate { get; set; } 
     public virtual User User { get; set; } 

     //Metadata table values: 
     public virtual string PrepNumber { get; set; } 
     public virtual string Host { get; set; } 
     public virtual string NTermTag { get; set; } 
     public virtual string CTermTag { get; set; } 
     public virtual string Buffer { get; set; } 
     public virtual double ConcentrationMgPerMl { get; set; } 
     public virtual double StorageTemperatureCelsius { get; set; } 
     public virtual string PurificationProtocol { get; set; } 
     public virtual string Comments { get; set; } 
     public virtual string ProteinSequence { get; set; } 
    } 

Il serait idéal si je pouvais obtenir NHibernate pour mettre les données de la paire table de métadonnées clé-valeur dans chacune des propriétés ci-dessus (PrepNumber, hôte, NTermTag, etc ...) directement. À l'heure actuelle ce que j'ai est le suivant:

public class ProteinSample : PersistentObject 
     { 

      public virtual SampleType SampleType { get; set; } 
      public virtual Project Project { get; set; } 
      public virtual long Variant { get; set; } 
      public virtual DateTime CreationDate { get; set; } 
      public virtual User User { get; set; } 

      public virtual IList<SampleMetadata> Metadata { get; set; } 
     } 

public class SampleMetadata : PersistentObject 
    { 
     public virtual ProteinSample ProteinSample { get; set; } 
     public virtual MetadataType MetadataType { get; set; } 
     public virtual string Value { get; set; } 
     public virtual string LargeValue { get; set; } 
    } 

public class MetadataType : PersistentObject 
    { 
     public virtual string MetadataDictionaryName { get; set; } 
    } 

qui travaille, mais je veux que la liste aplatie dans le spécifique I propriétés dans la première classe au-dessus. Je peux fournir mes mappings Fluent NHibernate si les gens veulent les voir.

Est-ce que c'est peut-être un travail pour AutoMapper après avoir retiré les données?

Que pensent les gens?

Le problème METADATA_LARGE_VALUE par rapport à METADATA_VALUE, qui s'excluent mutuellement, est assez compliqué. Des suggestions là-bas?

Merci pour toute contribution.

Répondre

1

La chose clé que je vois ici est Separation of Concerns:

Votre objet de domaine contient également la connaissance de la façon dont il est persistait (car il hérite de PersistableObject), et qui est une trop grande responsabilité pour un objet de l'OMI. La persistance et la logique métier sont des problèmes distincts.

Au lieu d'essayer de la carte à ProteinSample directement en utilisant NHibernate, je vous recommande de créer (AutoGenerate est le meilleur) des classes qui reflètent les tables de schéma (alias DTO), puis la carte manuellement entre les DTO (par exemple MetadataDto, MetadataDictDto, SamplesDto) et votre entité de domaine (ProteinSample) dans votre ProteinSampleRepository. Je pense que cela facilitera la gestion du problème.

+0

Merci pour votre réponse - recommandez-vous un outil particulier de rétro-ingénierie/autogénération? – jeffdoto

+0

En fait, je veux juste dire que j'ai trouvé ce post: http://stackoverflow.com/questions/2604362/class-map-generator-for-fluent-nhibernate qui fait référence à cet outil de cartographie de ThoughtWorks: http: // www. codeplex.com/Wikipage?ProjectName=nmg; À première vue, c'est ridiculement génial. Je viens d'inverser l'ingénierie de la DB dans environ 2 minutes - je suis sur le point de le tester ... – jeffdoto

+0

J'ai vraiment aimé utiliser CodeSmith, mais ça coûte de l'argent. Si ce n'est pas une option, vous devriez pouvoir interroger les métadonnées du schéma d'Oracle en utilisant ADO.NET et générer les fichiers vous-même en assemblant des chaînes. –

Questions connexes