NHibernate: как отобразить точку? - PullRequest
3 голосов
/ 30 апреля 2009

У меня есть класс, который содержит коллекцию очков (точнее PointF).

Я хочу иметь возможность сохранять экземпляры этого класса с помощью NHibernate.

Мой класс выглядит примерно так (упрощенно):

public class MyClass
{
    public IDictionary<string, PointF> Points = new Dictionary<string, PointF>();

    public void AddPoint( location, PointF position )
    {
        Points.Add(location, position);
    }
}

Отображение этой коллекции выглядит так (упрощенно):

<map name="Points" table="Locations">
   <key column="MyClassId" />
   <index column="LocationName" />
   <composite-element class="System.Drawing.PointF, System.Drawing">
      <property name="X" column="X" />
      <property name="Y" column="Y" />
   </composite-element>
</map>

Проблема в том, что NHibernate выдает ошибку при обработке файла сопоставления, поскольку PointF не является известным (сопоставленным) объектом.

Как я могу решить это самым простым способом? Как я могу убедиться, что NHibernate может сохранить мою коллекцию локаций (с их координатами (точкой)?

1 Ответ

1 голос
/ 21 октября 2009

Проблема не в том, что вы не отображали тип PointF - потому что вы отображаете его как составной-элемент, что правильно.

При отображении таких типов необходимо убедиться,

  • что свойства доступны для записи (что, к счастью, и здесь)
  • что у него есть конструктор по умолчанию, что здесь не так.

Итак, как NH должен создавать новые экземпляры, когда нет конструктора по умолчанию? Не может.

Ваши варианты:

  • реализовать перехватчик или событие NH. Я думаю, что можно внедрить туда код, который создает экземпляры определенных типов, но я не знаю, как.
  • реализовать пользовательский тип NH (производный от ICompositeUserType), что не так уж сложно сделать
  • сопоставить другой тип (например, оболочку с PointF)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...