Картографирование геопространственных точек в беглом NHibernate - PullRequest
1 голос
/ 19 мая 2011

Я изо всех сил пытаюсь заставить Fluent NHibernate хорошо работать с типами геопространственных данных SQL Server. Я хочу сохранить географическую точку в своем классе Place, но получаю сообщение об ошибке конфигурации NHibernate при запуске приложения ASP.NET MVC:

Method 'SetParameterValues' in type 'NHibernate.Spatial.Type.GeometryType' from
assembly 'NHibernate.Spatial, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=null' does not have an implementation.

Обновление : Это вызвано устаревшей библиотекой NHibernate.Spatial. Ссылка на последнюю версию (2.2+) решает проблему. Престижность псусе за то, что она привела меня к решению.

Place класс:

using System;
using GisSharpBlog.NetTopologySuite.Geometries;
using NHibernate.Validator.Constraints;

namespace MyApp.Data.Entities
{
    public class Place
    {
        public virtual Guid Id { get; set; }
        public virtual string Name { get; set; }
        public virtual Point Location { get; set; }
    }
}

Свободно Place Отображение:

using MyApp.Data.Entities;
using FluentNHibernate.Mapping;
using NHibernate.Spatial.Type;

namespace MyApp.Data.Mappings
{
    public class PlaceMap : ClassMap<Place>
    {
        public PlaceMap()
        {
            ImportType<GisSharpBlog.NetTopologySuite.Geometries.Point>();

            Id(x => x.Id);
            Map(x => x.Name);

            Map(x => x.Location)
                .CustomType(typeof(GeometryType));
        }
    }
}

Свободная конфигурация NHibernate:

var cfg = Fluently.Configure()
    .Database(MsSqlConfiguration.MsSql2008
        .ConnectionString(c => c.FromConnectionStringWithKey(connectionStringKey))
    .ShowSql()
    .Dialect("NHibernate.Spatial.Dialect.MsSql2008GeographyDialect,NHibernate.Spatial.MsSql2008"))
    .ExposeConfiguration(BuildSchema)
    .Mappings(x => x.FluentMappings.AddFromAssembly(typeof(UserMap).Assembly)
    .Conventions.AddFromAssemblyOf<ColumnNullabilityConvention>());

1 Ответ

5 голосов
/ 20 мая 2011

Вы используете диалект Geography , но используете CustomType Geometry в вашем отображении. Вы должны использовать пользовательский тип География . Что-то вроде:

public class PlaceMap : ClassMap<Place>
{
    public PlaceMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);

        Map(x => x.Location).CustomType(typeof(MsSql2008GeographyType)); //for SQL2008
    }
}

Кроме того, есть еще кое-что, что вам может понадобиться. Если ваш пространственный столбец имеет SRID, отличный от 0 (ноль), и если вы хотите пропустить сопоставления NH xml, вам нужно объявить пользовательский тип, например:

public class Wgs84GeographyType : MsSql2008GeographyType
{
    protected override void SetDefaultSRID(GeoAPI.Geometries.IGeometry geometry)
    {
        geometry.SRID = 4326;
    }
}

А затем используйте его для отображения:

public class PlaceMap : ClassMap<Place>
{
    public PlaceMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);

        Map(x => x.Location).CustomType(typeof(Wgs84GeographyType));
    }
}

ОБНОВЛЕНИЕ:

Вы должны ссылаться на NHibernate.Spatial.MsSql2008.dll, и я бы посоветовал вам использовать строго типизированный метод Dialect в конфигурации вашей базы данных.

.Dialect<MsSql2008GeographyDialect>()
...