Отображение перечисления на разные значения - PullRequest
0 голосов
/ 31 декабря 2010

У меня есть две похожие таблицы (Table1, Table2), поэтому я создал базовый абстрактный класс, который имеет общие свойства. В каждой таблице есть столбец с указанием статуса обработки записи. Я хотел бы сопоставить эти столбцы с одним перечислением:

enum RecordStatus
{
     UnkownStatus,
     NotProcessed,
     Processed,
}

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

Итак, я создал два конвертера (Table1StatusConverter, Table2StatusConverter), которые наследуются от EnumType<RecordStatus> и настроены в сопоставлениях. Работает частично. Частично потому, что NHibernate использует только один конвертер в обоих классах.

Это ошибка или, может быть, она работает так, как описано в дизайне? Есть ли обходной путь для этого?

Редактировать: Я пишу код из памяти, потому что в тот момент, когда у меня нет к нему доступа

Сущность:


class abstract TableBase
{
  public Guid Id { get; protected set; }
  public string Sender { get; protected set; }
  public DateTime ReceiveTime { get; protected set; }
  public RecordStatus Status { get; set; }
}

class Table1 : TableBase
{
  public string Message { get; set; }
}

class Table2 : TableBase
{
  public ICollection Parts { get; protected set; }
}

Преобразователи: Table1StatusConverter и Table2StatusConverter переопределяют один и тот же метод, но по-разному.

class Table1StatusConverter : EnumType<RecordStatus>
{
    public override object GetValue(object enumValue) { ... }
    public override object GetInstance(object value) { ... }
}

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


Table1.hbm.xml
<class name="Table1" table="Table1">
 ..
 <property name="Status" type="MyAssembly.Table1StatusConverter, MyAssembly" />
 ..
</class>

Table2.hbm.xml
<class name="Table2" table="Table2">
 ..
 <property name="Status" type="MyAssembly.Table2StatusConverter, MyAssembly" />
 ..
</class>


Ответы [ 2 ]

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

Это не похоже на хорошее использование наследования.Однако этого можно достичь, сопоставив целочисленное значение для перечислений как защищенное поле в базовом классе и используя открытые свойства в расширенных классах для приведения к соответствующему перечислению и из него.

0 голосов
/ 13 января 2012

Может быть, вам нужно явно переопределить эти свойства?


class abstract TableBase
{
   //  ...
   public virtual RecordStatus Status { get; set; }
}

class Table1 : TableBase
{
   public string Message { get; set; }
   public override RecordStatus Status { get; set; }
}

class Table2 : TableBase
{
   public ICollection Parts { get; protected set; }
   public override RecordStatus Status { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...