我正在使用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是正确的。
答案 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)