2009-04-06 15 views
3

Ich habe die folgende XML (.hbm):Fluent NHibernate Problem (ClassMap)

<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> 

Es ist mit Nhibernate Spatial-Typ ... Wie kann ich Karte, die Eigenschaft mit ClassMap (fliessend Nhibernate)?

Dank

Antwort

3

Nun, ich habe NHibernate Spatial nicht verwendet, aber ich durchsuchte den Code durch und es sieht aus wie GeometryType erbt von IUserType so sollten Sie in der Lage sein, es zu benutzen mit .CustomTypeIs<>

Zum Beispiel:

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

es sei denn, es geschieht automatisch, dass wahrscheinlich nicht wenn Sie Ihre param Elemente erhalten. Ich bin nicht sicher, ob ein wirklich schöner Weg, dies zu tun, aber Sie können eine XML-Änderung wie so immer hinzufügen:

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") 
    ); 

Beachten Sie, dass die WithText Funktionalität zu erhalten, werden Sie eine Erweiterung hinzufügen, um für XmlElement wie so (WithAtt und AddElement sind Erweiterungen im FluentNHibernate.Mapping Namespace):

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

Beim Versuch, den Code zu verwenden, um mit Fluent NHibernate 1.0 ich bin nicht in der Lage, die AddAlteration Funktion innerhalb des PropertyPart Typs zu finden. Arbeitet Ihr Code mit der Version 1.0 von Fluent NHibernate? – Martin

+0

Nein, das funktioniert nicht mehr. In der Tat wurde WithAtt nicht lange nachdem ich diesen Beitrag gemacht habe, wenn der Speicher dient, entfernt. Sie können den benutzerdefinierten Typ immer noch mit Map (x => ...) festlegen.CustomType (), aber ich glaube nicht, dass Sie das param-Attribut/die Parameter dort finden können. Ich würde vorschlagen, in der FNH-Gruppe unter http://groups.google.com/group/fluent-nhibernate zu posten –