Я пытаюсь сопоставить следующую настройку таблицы, над которой у меня нет контроля (извините за текстовые таблицы, я пока не могу публиковать изображения):
**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 довольно сложна. Есть предложения?
Спасибо за любой вклад.