Отображение NHibernate типа List <Point> - PullRequest
1 голос
/ 04 мая 2011

У меня есть одно свойство, которое я хочу сохранить в двух отдельных столбцах mysql.

Свойство определяется как:

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

Точка - 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 Ответ

2 голосов
/ 04 мая 2011

Я признаю, что не использовал 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
}

Очевидно, с дополнительной проверкой ошибок. Надеюсь, это поможет.

...