0

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();
4

1 に答える 1

0

この問題は、 NHibernate.Spatial.MySQLで MySQL 5.7 がサポートされていないことが原因でした。この問題を修正するNHibernate.Spatial.MySQLのプレリリース バージョンに新しいMySQL57SpatialDialectを追加しました。

于 2016-05-02T16:40:03.427 に答える