NHibernate: TINYINT вместо геометрии - PullRequest
3 голосов
/ 15 апреля 2011

Я работаю над проектом C # с использованием NHibernate, я использую fluant-nhibernate с autoMapping:

        FluentConfiguration configuration = Fluently.Configure()
            .Database(databaseConfig)
            .Mappings(m => m.AutoMappings.Add(AutoMap.AssemblyOf<Entity>(mappingConfiguration).Conventions.Add<GeometryTypeConvention>()));

У меня есть классы со свойствами IGeometry, я настроил автоматическое сопоставление с собственным типом соглашения:

public class GeometryTypeConvention : IUserTypeConvention
{
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
    {
        criteria.Expect(p => p.Property.PropertyType == typeof (IGeometry));
    }

    public void Apply(IPropertyInstance instance)
    {
        instance.CustomType(typeof(MsSql2008GeometryType));
    }
}

Когда я обновляю схему, база данных создается, но все свойства Geometry в классах задаются как столбцы TINYINT.

Я видел почти такую ​​же проблему на http://www.klopfenstein.net/lorenz.aspx/null-geometry-values-in-nhibernate-spatial-for-mssql2008,, но файл MsSql2008GeometryType.cs, который я использую, является правильным.

Ответы [ 2 ]

4 голосов
/ 15 апреля 2011

У меня была такая же проблема, и я решил ее таким образом (используя географию вместо геометрии, но она очень похожа):

Сначала (этот шаг не является обязательным), и поскольку мне требовалось работать с координатами WGS84, я создал следующий тип:

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

Затем я создал соглашение, похожее на ваше, но с указанным методом «CustomSqlType»:

public class Wgs84GeographyTypeConvention : IPropertyConvention
{
    public void Apply(IPropertyInstance instance)
    {
        if (typeof(IGeometry).IsAssignableFrom(instance.Property.PropertyType))
        {
            instance.CustomType(typeof(Wgs84GeographyType));
            instance.CustomSqlType("GEOGRAPHY");
        }
    }
}

После этого генерация схемы должна работать без проблем.

1 голос
/ 15 сентября 2011

Вы должны использовать SpatialAuxiliaryDatabaseObject для правильной генерации пространственной схемы.При использовании Fluent NHibernate это будет выглядеть так:

    .ExposeConfiguration(
        cfg =>
        {
            cfg.AddAuxiliaryDatabaseObject(new SpatialAuxiliaryDatabaseObject(cfg));
            new SchemaExport(cfg).Create(true, true);
        })

Кроме того, установите диалект в конфигурации базы данных:

    .Database(MsSqlConfiguration
        .MsSql2008
        .Dialect(typeof (MsSql2008GeometryDialect).AssemblyQualifiedName)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...