C# – Fluent Nhibernate problem (ClassMap)

cfluent-nhibernatenhibernate

I have the following XML (.hbm):

<property name="Geometry" column="the_geom">
   <type name="NHibernate.Spatial.Type.GeometryType,NHibernate.Spatial">
      <param name="subtype">MULTIPOLYGON</param>
      <param name="srid">-1</param>
   </type>
</property>

It´s using Nhibernate Spatial type…
How can I map that property using ClassMap (Fluent Nhibernate) ?

Thanks

Best Answer

Well, I've not used NHibernate Spatial, but I browsed through the code and it looks like GeometryType inherits from IUserType so you should be able to use it with .CustomTypeIs<>

For example:

Map(x => x.Geometry, "the_geom").CustomTypeIs<GeometryType>();

Unless it happens automagically, that probably won't get you your param elements though. I'm not sure of a truly nice way to do this but you can always add an XML alteration like so:

Map(x => x.Geometry, "the_geom").AddAlteration(p => p.AddElement("type")
    .WithAtt("name", "NHibernate.Spatial.Type.GeometryType,NHibernate.Spatial")
        .AddElement("param")
            .WithAtt("name", "subtype")
            .WithText("MULTIPOLYGON")
        .ParentNode
        .AddElement("param")
            .WithAtt("name", "srid")
            .WithText("-1")
    );

Note that to get the WithText functionality, you'll have to add an extension for XmlElement like so (WithAtt and AddElement are extensions in the FluentNHibernate.Mapping namespace):

public static class XmlExtensions
{
    public static XmlElement WithText(this XmlElement element, string text)
    {
        element.InnerText = text;
        return element;
    }
}
Related Topic