类型为List的NHibernate映射
本文关键字:NHibernate 映射 Point List 类型 | 更新日期: 2023-09-27 17:54:36
我有一个单独的属性,我想存储在两个单独的mysql列。
属性定义为:
public virtual List<Point> Vertices { get; set; }
Point is 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中实现这一点的最佳方法,考虑到上面的约束。
我承认我没有使用过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
}
显然有更多的错误检查。