将几何图形从 SQLServer2008 映射到 .NET (NHibernate 4.0.0.4000)
Mapping Geometry from SQLServer2008 to .NET (NHibernate 4.0.0.4000)
我尝试使用 FluentNHibernate 映射 SqlServer2008 几何图形。我正在使用 NHibernate 版本 4.0.0.4000。我用 FluentNhibernate 安装了 NHibernate.Spatial、NetTopologySuite、GeoAPI 和 NHibernate,所有这些都带有 NUget。
我的 Fluent 映射如下所示:
public class ArealMap: ClassMap<Areal>
{
public Areal()
{
Table("Areal");
Id(x => x.Id).Column("Id").GeneratedBy.Identity();
Map(x => x.Geometry).Column("Geometry").CustomType(typeof(MsSql2008GeometryType));
}
}
public class Areal
{
....
public virtual Geometry Geometry{ get; set; }
}
在 NHibernate 4.0.0.4000 中,Areal 将始终映射到 null 而不是 DB(几何类型)中的值。非几何属性映射正确。
此映射在 NHibernate 3.3.3 中运行良好。
我还添加了
.Dialect<MsSql2008GeometryDialect>())
我流畅的配置....
我认为所有的 dll 都安装了正确的版本,因为我是通过 NUget 获得的。我不认为这是一个 NH /Fluent NH 问题,因为我所有其他映射都工作正常...
NH 4.0 版本中是否有用于将 sql 服务器几何图形映射到 NHibernate 的新语法?我不知道我错过了什么..
编辑:
当我将映射更改为:
Map(x => x.Geometry).Column("Geometry").CustomType(typeof(MsSqlLegacyGeometryType));
我不再在 Geometry 中得到 null,而是写入数据库中的多边形
映射为具有不同坐标的点类型的几何....
我认为这个问题可能是由于使用的Microsoft.SqlServer.Types版本不同造成的... SqlServer2008使用的是10.0版本和NHibernate.Spatial.MsSql使用的版本11.0...
或者 GeoApi 或 NetTopologySuite 中可能会有重大变化...
编辑:
好的,我找到了问题的根源....
我正在使用 Sql Server 2008,因此它在
中使用 Microsoft.SqlServer.Types.dll
C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Types.0.0.0__89845dcd8080cc91\
然而,与 NHibernate 4.0 一起工作的 NHibernate.Spatial dll 期望更高的 SQLServer 和引用 Microsoft.SqlServer.Types.dll 版本 11 in
C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Types.0.0.0_89845dcd8080cc91\
有人知道如何解决这个问题吗?
我想我必须签出/克隆 NHibernate.Spatial 项目之一并手动引用 Microsoft.SqlServer.Types.dll 版本 10,然后重新编译项目...
但是我不知道从哪里开始。我需要重新编译哪些项目? NHibernate.Spatial 或仅 NHibernate.Spatial?
引用的 NetTopologySuite
虽然可能不理想,因为它迫使您使用旧版本,但在 NHibernate 升级后,我能够通过在 web.config
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="10.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
我尝试使用 FluentNHibernate 映射 SqlServer2008 几何图形。我正在使用 NHibernate 版本 4.0.0.4000。我用 FluentNhibernate 安装了 NHibernate.Spatial、NetTopologySuite、GeoAPI 和 NHibernate,所有这些都带有 NUget。
我的 Fluent 映射如下所示:
public class ArealMap: ClassMap<Areal>
{
public Areal()
{
Table("Areal");
Id(x => x.Id).Column("Id").GeneratedBy.Identity();
Map(x => x.Geometry).Column("Geometry").CustomType(typeof(MsSql2008GeometryType));
}
}
public class Areal
{
....
public virtual Geometry Geometry{ get; set; }
}
在 NHibernate 4.0.0.4000 中,Areal 将始终映射到 null 而不是 DB(几何类型)中的值。非几何属性映射正确。
此映射在 NHibernate 3.3.3 中运行良好。 我还添加了
.Dialect<MsSql2008GeometryDialect>())
我流畅的配置....
我认为所有的 dll 都安装了正确的版本,因为我是通过 NUget 获得的。我不认为这是一个 NH /Fluent NH 问题,因为我所有其他映射都工作正常...
NH 4.0 版本中是否有用于将 sql 服务器几何图形映射到 NHibernate 的新语法?我不知道我错过了什么..
编辑:
当我将映射更改为:
Map(x => x.Geometry).Column("Geometry").CustomType(typeof(MsSqlLegacyGeometryType));
我不再在 Geometry 中得到 null,而是写入数据库中的多边形 映射为具有不同坐标的点类型的几何....
我认为这个问题可能是由于使用的Microsoft.SqlServer.Types版本不同造成的... SqlServer2008使用的是10.0版本和NHibernate.Spatial.MsSql使用的版本11.0... 或者 GeoApi 或 NetTopologySuite 中可能会有重大变化...
编辑:
好的,我找到了问题的根源....
我正在使用 Sql Server 2008,因此它在
中使用 Microsoft.SqlServer.Types.dllC:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Types.0.0.0__89845dcd8080cc91\
然而,与 NHibernate 4.0 一起工作的 NHibernate.Spatial dll 期望更高的 SQLServer 和引用 Microsoft.SqlServer.Types.dll 版本 11 in
C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Types.0.0.0_89845dcd8080cc91\
有人知道如何解决这个问题吗?
我想我必须签出/克隆 NHibernate.Spatial 项目之一并手动引用 Microsoft.SqlServer.Types.dll 版本 10,然后重新编译项目...
但是我不知道从哪里开始。我需要重新编译哪些项目? NHibernate.Spatial 或仅 NHibernate.Spatial?
引用的 NetTopologySuite虽然可能不理想,因为它迫使您使用旧版本,但在 NHibernate 升级后,我能够通过在 web.config
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="10.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>