NHibernate.Spatial.MySQL (バージョン 4.0.4.4001) を使用して簡単なデモ ソリューションを作成しようとしています。ソリューションはこちらから入手できます: https://github.com/andrerav/NHibernate.Spatial.MySql.Demo
マッピングは、少なくとも挿入では機能するようです。DemoDataImport プロジェクトは、GeoJSON ファイルを読み取り、ジオメトリをデータベースに挿入できます。また、MySQL Workbench を使用して結果を確認できます。
ただし、データをクエリすると、ジオメトリは常に null 値で表示されます。さらに、次のようなクエリを実行すると:
var municipalities = SessionManager.Session.Query<Municipality>()
.Where(m => m.Area.Within(county.Area)).ToList();
"No persister for: GeoAPI.Geometries.IGeometry" という例外が発生します。
何が間違っている可能性がありますか?
ソリューションを実行するには、最初にmysqldemoという名前の mysql データベース (mysql 5.7 以降)をユーザー名/パスワードmysqldemo / mysqldemoで作成します。DemoDataImport プロジェクトは geojson データをデータベースにダンプし、DemoQueryUtil プロジェクトを使用してクエリを実行できます。
マッピング:
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>();
}
}
構成:
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();
}
クエリの例:
var county = SessionManager.Session.Query<County>().First();