Отображение вертикальной таблицы предыдущих версий с помощью гибкого NHibernate - PullRequest
1 голос
/ 09 декабря 2010

Я пытаюсь сопоставить следующую настройку таблицы, над которой у меня нет контроля (извините за текстовые таблицы, я пока не могу публиковать изображения):

**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)

По сути, в образце есть коллекция атрибутов метаданных, каждый из которых представляет собой пару ключ / значение (с небольшим уловкой, в которой значение может быть либо в столбце CLOB, либо в столбце varchar2, в зависимости от его размера. ). Ключ каждой пары ключ / значение соответствует типу собираемой информации (METADATA_DICT_ID), в то время как ключ соответствует значению, предоставленному пользователем (METADATA_VALUE / METADATA_LARGE_VALUE). Пользователю может быть предложено ввести «Plasmid Type», и он ответит, например, «Source Clone». Причиной для этого было то, что пользователь может динамически добавлять новые типы информации (вопросы) для сбора образцов, определяя новые типы метаданных. На самом деле это работает очень хорошо для их целей, но я хочу сейчас создать модель домена для использования в приложении ASP.NET MVC и заполнить эту модель домена NHibernate.

Кажется, есть несколько способов приблизиться к этому. В конечном итоге мне нужны данные в следующей структуре:

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

Было бы идеально, если бы я мог заставить NHibernate напрямую помещать данные из таблицы метаданных пары ключ-значение в каждое из указанных выше свойств (PrepNumber, Host, NTermTag и т. Д.). В настоящее время у меня есть следующее:

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

, который работает, но я хочу, чтобы список List был сведен к конкретным свойствам I в первом классе выше. Я могу предоставить свои сопоставления Fluent NHibernate, если люди хотят их видеть.

Возможно, это работа для AutoMapper после того, как я вытащу данные?

Что думают люди?

Взаимно исключающая проблема METADATA_LARGE_VALUE и METADATA_VALUE довольно сложна. Есть предложения?

Спасибо за любой вклад.

1 Ответ

1 голос
/ 09 декабря 2010

Ключевое, что я вижу здесь, это Разделение проблем :

Ваш доменный объект также содержит сведения о том, как он сохраняется (поскольку он наследуется от PersistableObject), и это слишком большая ответственность для одного объекта IMO. Постоянство и бизнес-логика - это отдельные вопросы.

Вместо того, чтобы пытаться сопоставить ProteinSample напрямую с помощью nHibernate, я бы порекомендовал вам создать (лучше всего сгенерировать автоматически) классы, которые отражают таблицы схем (или DTO), а затем вручную отобразить между DTO (например, MetadataDto MetadataDictDto, SamplesDto) и ваше доменное имя (ProteinSample) в вашем ProteinSampleRepository.

Думаю, это облегчит решение проблемы.

...