NHibernate:TINYINT而不是几何

时间:2011-04-15 14:52:54

标签: c# nhibernate fluent-nhibernate

我正在使用NHibernate开发一个C#项目,我使用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 个答案:

答案 0 :(得分:4)

我有同样的问题,我用这种方式解决了(使用地理而不是几何,但它非常相似):

首先(此步骤是可选的),因为我需要使用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 :(得分:1)

您应该使用SpatialAuxiliaryDatabaseObject来正确生成与空间相关的架构。使用Fluent NHibernate,这看起来像:

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

另外,在数据库配置中设置方言:

    .Database(MsSqlConfiguration
        .MsSql2008
        .Dialect(typeof (MsSql2008GeometryDialect).AssemblyQualifiedName)