Свободное отображение NHibernate IList <Point>как значение для одного столбца - PullRequest
3 голосов
/ 02 мая 2010

У меня есть этот класс:

public class MyEntity
{
    public virtual int Id { get; set; }
    public virtual IList<Point> Vectors { get; set; }
}

Как мне сопоставить Vectors в Fluent NHibernate с одним столбцом (как значение)? Я думал об этом:

public class Vectors : ISerializable
{
    public IList<Point> Vectors { get; set; }

    /* Here goes ISerializable implementation */
}

public class MyEntity
{
    public virtual int Id { get; set; }
    public virtual Vectors Vectors { get; set; }
}

Можно ли отобразить Vectors таким образом, надеясь, что Fluent NHibernate инициализирует класс Vectors как стандартный ISerializable?

Или как еще можно сопоставить IList<Point> с одним столбцом? Я полагаю, мне придется самому написать подпрограммы сериализации / десериализации, что не является проблемой, мне просто нужно сказать FNH использовать эти подпрограммы.

Полагаю, мне следует использовать IUserType или ICompositeUserType, но я не знаю, как их реализовать и как заставить FNH сотрудничать.

1 Ответ

4 голосов
/ 02 мая 2010

Нашел ответ. : -)

Заголовок UserTypeConvention<T> по адресу:
http://wiki.fluentnhibernate.org/Available_conventions
для пользовательских преобразований типов.

Это для реализации пользовательских преобразователей типов:
http://intellect.dk/post/Implementing-custom-types-in-nHibernate.aspx

Дополнительные ссылки, которые я нашел:
http://www.lostechies.com/blogs/rhouston/archive/2008/03/23/mapping-strings-to-booleans-using-nhibernate-s-iusertype.aspx
http://www.martinwilley.com/net/code/nhibernate/usertype.html
http://geekswithblogs.net/opiesblog/archive/2006/08/13/87880.aspx
http://kozmic.pl/archive/2009/10/12/mapping-different-types-with-nhibernate-iusertype.aspx
http://blogs.msdn.com/howard_dierking/archive/2007/04/23/nhibernate-custom-mapping-types.aspx

UserTypeConvention<T> использование:
http://jagregory.com/writings/fluent-nhibernate-auto-mapping-type-conventions/

Самый важный код в последней ссылке:

public class ReplenishmentDayTypeConvention : ITypeConvention
{
  public bool CanHandle(Type type)
  {
    return type == typeof(ReplenishmentDay);
  }

  public void AlterMap(IProperty propertyMapping)
  {
    propertyMapping
      .CustomTypeIs<ReplenishmentDayUserType>()
      .TheColumnNameIs("RepOn");
  }
}

Где ReplenishmentDayUserType - это IUserType -производный класс, а ReplenishmentDay - это класс, который должен быть преобразован с помощью вашего пользовательского конвертера типов.

А это:

autoMappings
  .WithConvention(convention =>
  {
    convention.AddTypeConvention(new ReplenishmentDayTypeConvention());
    // other conventions
  });
...