Ich versuche, eine einfache Demo-Lösung mit NHibernate.Spatial.MySQL (Version 4.0.4.4001) zu erstellen. Die Lösung ist hier verfügbar: https://github.com/andrerav/NHibernate.Spatial.MySql.DemoNHibernate.Spatial.MySQL: Null Geometrien und "Kein Persister für: GeoAPI.Geometries.IGeometry" Fehler
Das Mapping scheint zumindest für Einfügungen zu funktionieren - das DemoDataImport-Projekt kann die GeoJSON-Dateien lesen und Geometrien in die Datenbank einfügen, und ich kann die Ergebnisse mit MySQL Workbench überprüfen.
Wenn ich jedoch die Daten abfrage, werden Geometrien immer mit Nullwerten angezeigt. Außerdem, wenn ich eine Abfrage wie dies auszuführen:
var municipalities = SessionManager.Session.Query<Municipality>()
.Where(m => m.Area.Within(county.Area)).ToList();
Ich erhalte eine Ausnahme, die „No persister für: GeoAPI.Geometries.IGeometry“ sagt.
Irgendwelche Ideen, was könnte falsch sein?
die Lösung auszuführen, zuerst eine MySQL-Datenbank erstellen (mysql 5.7 oder neuer) mysqldemo mit Benutzername/Passwort mysqldemo/mysqldemo genannt. Das DemoDataImport-Projekt wird Geojson-Daten in die Datenbank ablegen, und das DemoQueryUtil-Projekt kann zum Ausführen von Abfragen verwendet werden.
Mapping:
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>();
}
}
Konfiguration:
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();
}
Beispiel query:
var county = SessionManager.Session.Query<County>().First();
Bevor jemand eine Menge Zeit in dieses investiert; Ich habe die Ursache gefunden. MySQL 5.7 führte einige Änderungen ein, die mit NHibernate.Spatial.MySQL nicht kompatibel waren. Ich habe einen konzeptionellen Fix geschrieben und werde dies zügig auf NuGet veröffentlichen und veröffentlichen. Wenn das passiert, werde ich eine Antwort zu diesem Post hinzufügen, mit Anweisungen, wie man den neuen Dialekt benutzt. – andrerav