1

Ich versuche, die folgende Tabelle Setup auf der Karte, von denen ich keine Kontrolle über (sorry für die Texttabellen, ich kann keine Bilder noch schreiben):Mapping Vertikal Legacy-Tabelle mit 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) 

Grundsätzlich enthält ein Beispiel eine Sammlung von Metadatenattributen, von denen jedes ein Schlüssel/Wert-Paar ist (mit einem kleinen Fehler, da der Wert abhängig von seiner Größe entweder in einer CLOB-Spalte oder in einer varchar2-Spalte enthalten sein kann). Der Schlüssel jedes Schlüssel/Wert-Paars entspricht einer Art von Information, die gesammelt wird (METADATA_DICT_ID), während der Schlüssel einem Wert entspricht, den der Benutzer geliefert hat (METADATA_VALUE/METADATA_LARGE_VALUE). Ein Benutzer wird möglicherweise aufgefordert, den "Plasmid-Typ" einzugeben, und er würde beispielsweise "Quellklon" antworten. Der Grund dafür war, dass ein Benutzer dynamisch neue Arten von Informationen (Fragen) hinzufügen kann, um Stichproben zu sammeln, indem neue Metadatentypen definiert werden. Das funktioniert tatsächlich ziemlich gut für ihre Zwecke, aber ich möchte jetzt ein Domänenmodell für die Verwendung in einer ASP.NET MVC-App erstellen und dieses Domänenmodell mit NHibernate auffüllen.

Es scheint, als gäbe es ein paar Möglichkeiten, dies zu erreichen. Letztlich will, ich die Daten in der folgenden Struktur:

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; } 
    } 

Es wäre ideal, wenn ich NHibernate Daten legt aus der Schlüssel-Wert-Paar Metadaten-Tabelle in jeden obigen Eigenschaften (PrepNumber, Host, NTermTag bekommen kann, etc ...) direkt. Derzeit, was ich habe ist folgendes:

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; } 
    } 

, die arbeitet, aber ich möchte, dass Liste in die spezifische I Eigenschaften, die oben in der ersten Klasse abgeflacht. Ich kann meine Fluent NHibernate-Mappings liefern, wenn die Leute sie sehen wollen.

Ist das vielleicht ein Job für AutoMapper, nachdem ich die Daten herausziehen?

Was denken die Leute?

Das sich gegenseitig ausschließende Problem METADATA_LARGE_VALUE vs. METADATA_VALUE ist ziemlich schwierig. Irgendwelche Vorschläge dort?

Danke für jede Eingabe.

Antwort

1

Der Schlüssel, was ich hier sehe, ist Separation of Concerns:

Ihre Domain-Objekt enthält auch Wissen, wie es beharrte ist (weil es von PersistableObject erbt), und das ist zu viel Verantwortung für ein Objekt IMO. Persistenz und Geschäftslogik sind separate Probleme.

Anstatt zu versuchen, zu ProteinSample mit nHibernate direkt abzubilden, würde ich empfehlen, die Sie erstellen (autogenerate ist am besten) Klassen, die Schematische Spiegel (aka DTOs) und dann zwischen den DTOs manuell Karte (zB MetadataDto, MetadataDictDto, SamplesDto) und Ihre Domain-Entität (ProteinSample) in Ihrer ProteinSampleRepository.

Ich denke, dass das Problem leichter zu verwalten wird.

+0

Vielen Dank für Ihre Antwort - empfehlen Sie ein bestimmtes Reverse Engineering/Auto-Generierungs-Tool? – jeffdoto

+0

Eigentlich möchte ich nur sagen, dass ich diesen Beitrag gefunden habe: http://stackoverflow.com/questions/2604362/class-map-generator-for-fluent-nhibernate, die dieses ThoughtWorks Mapping-Tool verweist: http: // www. codeplex.com/Wikipage?ProjectName=nmg; Auf den ersten Blick ist es lächerlich fantastisch. Ich habe die DB in ca. 2 Minuten einfach umgedreht - ich bin dabei, es zu testen ... – jeffdoto

+0

Ich habe CodeSmith sehr genossen, aber es kostet Geld. Wenn dies keine Option ist, sollten Sie in der Lage sein, die Metadaten des Oracle-Schemas mit ADO.NET abzufragen und die Dateien selbst zu generieren, indem Sie Zeichenketten zusammenstellen. –