【问题标题】:NHibernate mapping of type List<Point>List<Point> 类型的 NHibernate 映射
【发布时间】:2011-08-18 18:45:01
【问题描述】:

我有一个属性,我想将它存储在两个单独的 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 中实现这一目标的最佳方法。

【问题讨论】:

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


    【解决方案1】:

    我承认我没有使用过 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
    }
    

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

    【讨论】:

    • 好的,我可以这样做,但是有没有更好的方法来使用用户类型来利用框架?除了我会使用的用户类型之外,还有其他东西吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多