Сложное сопоставление компонентов NHibernate - PullRequest
0 голосов
/ 20 августа 2009

РЕДАКТИРОВАТЬ: я упростил проблему, чтобы оставить только то, что действительно беспокоит меня.

Привет всем,

Я пытаюсь сделать следующее сопоставление.

В моей базе данных есть таблица «ReportRowValue» со следующими столбцами:

  • RowNumber
  • Номер столбца
  • StringValue
  • LongValue
  • DateValue
  • Значение

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

ReportRow

  • RowNumber
  • Значения (коллекция ReportValue ниже)

ReportValue (будучи абстрактным классом)

  • ColumnNumber
  • Значение

ReportValueString / ReportValueLong / ReportValueDate (каждый наследует от ReportValue)

  • Значение (каждое из которых имеет свойство Value своего единственного типа)

И это все!

Кто-нибудь может подсказать мне, как создать для этого файл / файлы сопоставления nhibernate?

Спасибо

Meigetsu

Ответы [ 2 ]

0 голосов
/ 20 августа 2009

К сожалению, у вас не может быть полиморфной структуры в компоненте. Но я точно не уверен, что тебе это нужно.

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

public class ReportRow
{
  public int Id { get; private set; }
  public IList<IReportValue> Values { get; private set; }
}

public interface IReportValue
{
  public int Id{ get; set; }
  public object UntypedValue { get; }
}

public abstract class ReportValue<T> : IReportValue
{
  public int Id{ get; set; }
  public T Value { get; set; }
  public object UntypedValue { get { return Value; } }
}

public class ReportLongValue : ReportValue<long> {}
public class ReportStringValue : ReportValue<string> {}
public class ReportDateValue : ReportValue<DateTime>{}

Отображение:

<class ReportRow>
  <id ...>
  <bag name="Values" >
    <key column="RowNumber"/>
    <one-to-many class="IReportValue"/>
  </bag>
</class>

<class name="IReportValue" abstract="true">
  <id ...>
  <subclass name="ReportLongValue">
    <property name="Value" column="LongValue"/>
  </subclass>
  <subclass name="ReportStringValue">
    <property name="Value" column="StringValue"/>
  </subclass>
  <subclass name="ReportDateValue">
    <property name="Value" column="DateValue"/>
  </subclass>
</class>
0 голосов
/ 20 августа 2009

Есть пара инструментов, которые отображают и строят класс для вас, один из них -

mygeneration это программное обеспечение http://sourceforge.net/projects/mygeneration/

На этой странице вы найдете шаблоны, которые вам нужно запустить с Программное обеспечение http://www.mygenerationsoftware.com/TemplateLibrary/Archives/?query=nhibernate

После того, как вы установили это в инструменте mygeneration, вы подключаетесь только к своей БД, и она будет сгенерирована для вас

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...