将几何从SQLServer2008映射到.NET(NHibernate 4.0.0.4000)

时间:2015-03-20 09:25:49

标签: fluent-nhibernate spatial fluent-nhibernate-mapping

我尝试使用FluentNHibernate映射SqlServer2008几何体。我正在使用NHibernate版本4.0.0.4000。我用NUget安装了NHibernate.Spatial,NetTopologySuite,GeoAPI和NHibernate以及FluentNhibernate。

My 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 server geometry映射到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\10.0.0.0__89845dcd8080cc91\

然而,与NHibernate 4.0一起使用的NHibernate.Spatial dll期望更高的SQLServer并引用Microsoft.SqlServer.Types.dll版本11

C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Types\11.0.0.0_89845dcd8080cc91\

任何人都知道如何解决这个问题?

我想我必须签出/克隆其中一个NHibernate.Spatial项目并手动引用Microsoft.SqlServer.Types.dll版本10然后重新编译项目......

然而,我失去了从哪里开始。我需要重新编译哪些项目? NetTopologySuite由NHibernate.Spatial引用或仅引用NHibernate.Spatial?

1 个答案:

答案 0 :(得分:2)

虽然它可能并不理想,因为它迫使你使用旧版本,但我能够通过在web.config中使用程序集声明上的绑定重定向来解决NHibernate升级后涉及Geometry DLLS的不匹配问题。

<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>