类型为List <point> </point>的NHibernate映射

时间:2011-05-04 18:13:10

标签: c# .net mysql nhibernate nhibernate-mapping

我有一个属性,我想存储在两个单独的mysql列中。

该属性定义为:

public virtual List<Point> Vertices { get; set; }

Point是System.Drawing.Point。

我的数据库表有两列,我想将这一个属性保存到:

xarr VARCHAR(3000)
yarr VARCHAR(3000)

如果顶点包含以下几点:

{1,2}
{3,4}
{5,6}

当实体由Nhibernate保存时,我想要

yarr column to be populated with "2,4,6"
xarr column to be populated with "1,3,5"

请不要在重新设计数据库架构时告诉我。为了回答我的问题,我想知道在NHibernate中实现这一目标的最佳方法,考虑到上述限制。

1 个答案:

答案 0 :(得分:2)

我承认没有使用过NHibernate,但是你可以为xarray和yarray字符串添加两个属性到模型类

public string XArray { get { return string.Join(",", this.Vertices.Select(v => v.X.ToString())); } }
public string YArray { get { return string.Join(",", this.Vertices.Select(v => v.Y.ToString())); } }

然后坚持那些?

编辑: 好吧,如果我正确读到这个,听起来你想要创建一个VerticesType

public class VerticesType : IUserType
{
    public object NullSafeGet(IDataReader rs, string[] names, object owner)
    {
        var retval = new List<Point>();
        var xCoords = ((string) NHibernateUtil.String.NullSafeGet(rs, names[0])).Split(",");
        var yCoords = ((string) NHibernateUtil.String.NullSafeGet(rs, names[1])).Split(",");

        for(i = 0; i < xCoords.Length; i++)
        {
            retval.Add(new Point(int.Parse(xCoords[i]), int.Parse(yCoords[i])));
        }

        return retval;
    }

    public void NullSafeSet(IDbCommand cmd, object value, int index)
    {
        var list = value as List<Point>;
        if( list == null )
        {
            NHibernateUtil>String.NullSafeSet(cmd, null, index);
            NHibernateUtil>String.NullSafeSet(cmd, null, index + 1);
            return;
        }

        NHibernateUtil.String.NullSafeSet(cmd, string.Join(",", list.Select(v => v.X.ToString()), index);
        NHibernateUtil.String.NullSafeSet(cmd, string.Join(",", list.Select(v => v.Y.ToString()), index + 1);
    }

    # rest of IUserType implementation here
}

显然有更多的错误检查。希望有所帮助。