我正在尝试使用NHibernate.Spatial.MySQL(版本4.0.4.4001)创建一个简单的演示解决方案。该解决方案可在此处获取:https://github.com/andrerav/NHibernate.Spatial.MySql.Demo
映射似乎至少适用于插入 - DemoDataImport项目能够读取GeoJSON文件,并将几何图形插入到数据库中,我可以使用MySQL Workbench验证结果。
但是,如果我查询数据,几何总是显示空值。此外,如果我执行这样的查询:
var municipalities = SessionManager.Session.Query<Municipality>()
.Where(m => m.Area.Within(county.Area)).ToList();
我得到一个例外,说明了#34; No persister for:GeoAPI.Geometries.IGeometry&#34;。
任何想法可能出错?
要运行解决方案,首先使用用户名/密码 mysqldemo / mysqldemo 创建名为 mysqldemo 的mysql数据库(mysql 5.7或更新版本)。 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();
答案 0 :(得分:0)
此问题是由于NHibernate.Spatial.MySQL中缺少对MySQL 5.7的支持。我在MySQL57SpatialDialect的预发布版本中添加了一个新的NHibernate.Spatial.MySQL,修复了此问题。