2016-04-24 4 views
0

Je tente de créer une solution de démonstration simple en utilisant NHibernate.Spatial.MySQL (version 4.0.4.4001). La solution est disponible ici: https://github.com/andrerav/NHibernate.Spatial.MySql.DemoNHibernate.Spatial.MySQL: Géométries nuls et erreur "Pas de persistance pour: GeoAPI.Geometries.IGeometry"

Le mappage semble fonctionner au moins pour les insertions - le projet DemoDataImport est capable de lire les fichiers GeoJSON et d'insérer des géométries dans la base de données, et je peux vérifier les résultats avec MySQL Workbench. Cependant, si j'interroge les données, les géométries apparaissent toujours avec des valeurs NULL. De plus, si j'effectue une requête comme celle-ci:

var municipalities = SessionManager.Session.Query<Municipality>() 
         .Where(m => m.Area.Within(county.Area)).ToList(); 

Je reçois une exception qui dit: « Non pour persister: GeoAPI.Geometries.IGeometry ».

Des idées sur ce qui pourrait être faux?

Pour exécuter la solution, tout d'abord créer une base de données MySQL (MySQL 5.7 ou plus récent) appelé mysqldemo avec nom d'utilisateur/mot de passe mysqldemo/mysqldemo. Le projet DemoDataImport va déverser des données geojson dans la base de données et le projet DemoQueryUtil peut être utilisé pour exécuter des requêtes.

Cartographie:

public class Municipality 
{ 
    public virtual int Id { get; set; } 
    public virtual County County { get; set; } 
    public virtual string Name { get; set; } 
    public virtual int MunicipalityNo { get; set; } 
    public virtual IGeometry Area { get; set; } 
} 

public class MunicipalityMap : ClassMap<Municipality> 
{ 
    public MunicipalityMap() 
    { 
     ImportType<IGeometry>(); 
     Id(x => x.Id); 
     Map(x => x.Name); 
     Map(x => x.MunicipalityNo); 
     Map(x => x.Area).CustomType<MySQLGeometryType>(); 
     References(x => x.County).Nullable(); 
    } 
} 

public class County 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual int CountyNo { get; set; } 
    public virtual IGeometry Area { get; set; } 
    public virtual List<Municipality> Municipalities { get; set; } 

} 

public class CountyMap : ClassMap<County> 
{ 
    public CountyMap() 
    { 
     ImportType<IGeometry>(); 
     Id(x => x.Id); 
     Map(x => x.Name); 
     Map(x => x.CountyNo); 
     Map(x => x.Area).CustomType<MySQLGeometryType>(); 
    } 
} 

Configuration:

public static void Configure(bool generateTables = false) 
    { 
     var cfg = Fluently.Configure() 
      .Database(FluentNHibernate.Cfg.Db.MySQLConfiguration.Standard 
      .ConnectionString(c => c.FromConnectionStringWithKey("MySQL")) 
      .Driver<MySqlDataDriver>() 
      .ShowSql() 
      .Dialect<MySQLSpatialDialect>()) 
      .Mappings(x => x.FluentMappings.AddFromAssemblyOf<MunicipalityMap>()) 
      .BuildConfiguration(); 

     cfg.AddAuxiliaryDatabaseObject(new SpatialAuxiliaryDatabaseObject(cfg)); 

     if (generateTables) 
     { 
      var exporter = new SchemaExport(cfg); 
      exporter.Drop(false, true); 
      exporter.Create(true, true); 
     } 

     SessionManager.SessionFactory = cfg.BuildSessionFactory(); 

    } 

Exemple requête:

var county = SessionManager.Session.Query<County>().First(); 
+0

Avant que quelqu'un investisse beaucoup de temps dans cela; J'ai trouvé la cause première. MySQL 5.7 a introduit quelques changements qui n'étaient tout simplement pas compatibles avec NHibernate.Spatial.MySQL. J'ai écrit un correctif conceptuel et je l'aurai engagé et publié sur NuGet assez rapidement. Lorsque cela se produit, j'ajouterai une réponse à ce post avec des instructions sur la façon d'utiliser le nouveau dialecte. – andrerav

Répondre