我们有一个Fluent Nhibernate模型,它将连接到MS Sql Server 2008数据库,我们一直在针对SQLite测试数据库运行单元测试。
我们正在使用GeoAPI.Geometries来允许我们在班级中拥有IGeometry成员。 当针对SQLite内存测试数据库运行时,它通过我们作为约定添加到我们流畅的配置中的转换。:
public class SQLiteGeometryTypeConvention : IPropertyConvention
{
public void Apply(IPropertyInstance instance)
{
if (instance.Property.PropertyType.Equals(typeof(IGeometry)))
{
instance.CustomType(typeof(SQLiteGeometryType));
}
}
}
这是使用我们针对GeometryTypeBase(NHibernate.Spatial.Type)创建的类型,它适用于我们的测试。
当针对SqlServer运行时,我们正在尝试对抗NHibernate.Spatial.Type.MsSql2008GeometryType:
public void Apply(IPropertyInstance instance)
{
if (instance.Property.PropertyType.Equals(typeof(IGeometry)))
{
instance.CustomType(typeof(MsSql2008GeometryType));
}
}
但这导致属性返回为null。
有关我应该做什么的任何建议?是否不可能针对IGeometry投射该类型?
答案 0 :(得分:0)
在blog post我最初得到Sqlite代码之后,我实际上使用了相同的代码 Sql Server类型的代码。
我将SQL Server位重写为:
public class MsSqlGeometryConversion : IPropertyConvention
{
public void Apply(IPropertyInstance instance)
{
if (instance.Property.PropertyType.Equals(typeof(IGeometry)))
{
instance.CustomType(typeof(MsSqlGeometryHandler));
}
}
}
public class MsSqlGeometryHandler : GeometryTypeBase<string>
{
public MsSqlGeometryHandler()
: base(NHibernateUtil.String)
{
}
protected override string FromGeometry(object value)
{
return value != null ? ((IGeometry)value).AsText() : null;
}
protected override IGeometry ToGeometry(object value)
{
return value != null ? new WKTReader().Read((string)value) : null;
}
}
这似乎工作正常。