NHibernate:如何绘制一个点?

NHibernate:如何绘制一个点?,nhibernate,Nhibernate,我有一个类,它包含一组点(而不是点F) 我希望能够使用NHibernate持久化该类的实例 我的课堂看起来有点像这样(简化): 公共类MyClass { 公共IDictionary Points=新字典(); 公共无效添加点(位置,点F位置) { 点。添加(位置、位置); } } 此集合的映射如下所示(简化): 现在的问题是,NHibernate在处理映射文件时抛出错误,因为PointF不是已知(映射)实体 我如何用最简单的方法解决这个问题? 如何确保NHibernate能够持久保存我的位

我有一个类,它包含一组点(而不是点F)

我希望能够使用NHibernate持久化该类的实例

我的课堂看起来有点像这样(简化):

公共类MyClass
{
公共IDictionary Points=新字典();
公共无效添加点(位置,点F位置)
{
点。添加(位置、位置);
}
}
此集合的映射如下所示(简化):


现在的问题是,NHibernate在处理映射文件时抛出错误,因为PointF不是已知(映射)实体

我如何用最简单的方法解决这个问题?
如何确保NHibernate能够持久保存我的位置集合(及其坐标(点)?

问题不在于您没有映射类型
PointF
,因为您将其映射为复合元素,这是正确的

映射此类类型时,需要确保

  • 属性是可写的(幸运的是,这里就是这种情况)
  • 它有一个默认构造函数,这里不是这样
那么NH应该如何在没有默认构造函数的情况下创建新实例呢?它不能

你的选择是:

  • 实现一个拦截器或NH事件。我认为可以在那里注入代码来创建特定类型的实例,但我不知道如何实现
  • 实现一个NH用户类型(派生自
    ICompositeUserType
    ),这并不难做到
  • 映射另一种类型(例如包装器到PointF)

实际上,PointF是一种结构,因此,它应该有一个默认构造函数……与此同时,我通过创建另一种类型解决了这个问题,该类型有点包装PointF.Thx以供您输入。:)
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>