2011-04-15 5 views
3

Je travaille sur un projet C# en utilisant NHibernate, j'utilise fluant-NHibernate avec AutoMapping:NHibernate: TINYINT au lieu de la géométrie

 FluentConfiguration configuration = Fluently.Configure() 
      .Database(databaseConfig) 
      .Mappings(m => m.AutoMappings.Add(AutoMap.AssemblyOf<Entity>(mappingConfiguration).Conventions.Add<GeometryTypeConvention>())); 

J'ai des classes avec des propriétés IGeometry, j'ai configuré AutoMapping avec une auto Type de convention:

public class GeometryTypeConvention : IUserTypeConvention 
{ 
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria) 
    { 
     criteria.Expect(p => p.Property.PropertyType == typeof (IGeometry)); 
    } 

    public void Apply(IPropertyInstance instance) 
    { 
     instance.CustomType(typeof(MsSql2008GeometryType)); 
    } 
} 

Lorsque je mets à jour le schéma, la base de données est créée, mais toutes les propriétés de la géométrie dans les classes sont définies comme colonnes TINYINT.

J'ai vu presque le même problème sur http://www.klopfenstein.net/lorenz.aspx/null-geometry-values-in-nhibernate-spatial-for-mssql2008, mais le fichier MsSql2008GeometryType.cs que j'utilise est correct.

Répondre

4

J'ai eu le même problème, et je résolus de cette façon (en utilisant la géographie au lieu de la géométrie, mais il est très similaire):

première (cette étape est facultative), et parce que je devait travailler avec WGS84 coordonnées, j'ai créé le type:

public class Wgs84GeographyType : MsSql2008GeographyType 
{ 
    protected override void SetDefaultSRID(GeoAPI.Geometries.IGeometry geometry) 
    { 
     geometry.SRID = 4326; 
    } 
} 

Puis j'ai créé une convention en quelque sorte semblable à la vôtre, mais avec la méthode "CustomSqlType" spécifiée:

public class Wgs84GeographyTypeConvention : IPropertyConvention 
{ 
    public void Apply(IPropertyInstance instance) 
    { 
     if (typeof(IGeometry).IsAssignableFrom(instance.Property.PropertyType)) 
     { 
      instance.CustomType(typeof(Wgs84GeographyType)); 
      instance.CustomSqlType("GEOGRAPHY"); 
     } 
    } 
} 

Ensuite, la génération de schéma devrait fonctionner sans aucun problème.

1

Vous devez utiliser SpatialAuxiliaryDatabaseObject pour générer correctement un schéma relatif à l'espace. En utilisant Fluent NHibernate, cela ressemblerait à ceci:

.ExposeConfiguration(
     cfg => 
     { 
      cfg.AddAuxiliaryDatabaseObject(new SpatialAuxiliaryDatabaseObject(cfg)); 
      new SchemaExport(cfg).Create(true, true); 
     }) 

En outre, définissez le dialecte dans la configuration de base de données:

.Database(MsSqlConfiguration 
     .MsSql2008 
     .Dialect(typeof (MsSql2008GeometryDialect).AssemblyQualifiedName) 
Questions connexes