代码之家  ›  专栏  ›  技术社区  ›  Philipp

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

  •  2
  • Philipp  · 技术社区  · 10 年前

    我尝试使用FluentHibernate映射SqlServer2008几何图形。我使用的是NHibernate 4.0.0.4000版本。我用FluentHibernate安装了NHibernate.Sspatial、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/FluentNH问题,因为我的所有其他映射都工作正常。。。

    在NH4.0版本中,是否有新的语法将sql server几何映射到NHibernate?我不知道我错过了什么。。

    编辑:

    当我将映射更改为:

    Map(x => x.Geometry).Column("Geometry").CustomType(typeof(MsSqlLegacyGeometryType));
    

    我不再在几何中为空,而是在数据库中编写多边形 映射为具有不同坐标的几何类型点。。。。

    我认为此问题可能是由Microsoft.SqlServer的不同版本引起的。正在使用的类型。。。SqlServer2008使用版本10.0和NHibernate.Space.MsSql使用版本11.0。。。 或者GeoApi或NetTopologySuite可能会发生重大变化。。。

    编辑:

    好吧,我找到了问题的根源。。。。

    我使用的是Sql Server 2008,因此它在

    C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Types\10.0.0.0__89845dcd8080cc91\
    

    然而,与NHibernate4.0一起使用的NHibernate.Sspatial dll需要更高的SQLServer,并引用了中的Microsoft.SQLServer.Types.dll版本11

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

    有人知道如何解决这个问题吗?

    我想我必须签出/克隆NHibernate.Sspatial项目之一,并手动引用Microsoft.SqlServer.Types.dll版本10,然后重新编译该项目。。。

    然而,我不知从何开始。我需要重新编译哪些项目?NetTopologySuite,它被NHibernate.Sspatial引用还是仅被NHibeernate.SSpatial引用?

    1 回复  |  直到 10 年前
        1
  •  2
  •   richreuter    10 年前

    虽然可能不太理想,因为它迫使您使用旧版本,但我通过在web.config中的程序集声明上使用绑定重定向,解决了NHibernate升级后涉及几何DLL的不匹配问题

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