NHibernate.Spatial和Sql 2008地理类型 - 如何配置

Luk*_*ust 22 c# nhibernate geography fluent-nhibernate sql-server-2008

我试图使用Nhibernate与Sql 2008地理类型,并有困难.我正在使用Fluent Nhibernate配置我相当新的,所以这也可能是问题.

首先,我试图坚持的类看起来像:

public class LocationLog : FluentNHibernate.Data.Entity
{
   public virtual new int Id {get;set;}
   public virtual DateTime TimeStamp {get;set;}
   public virtual GisSharpBlog.NetTopologySuite.Geometries.Point Location {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

映射类如下所示:

public class LocationLogMap : ClassMap<LocationLog>
{
   ImportType<GisSharpBlog.NetTopologySuite.Geometries.Point>();
   Id(x => x.Id);
   Map(x => x.TimeStamp).Generated.Insert();
   Map(x => x.Location);
}
Run Code Online (Sandbox Code Playgroud)

为了将MsSql2008GeographyDialect与Fluent Nhibernate一起使用,我创建了自己的配置类:

public class Sql2008Configuration
  : PersistenceConfiguration<Sql2008Configuration, MsSqlConnectionStringBuilder>
{
   public Sql2008Configuration()
   {
      Driver<SqlClientDriver>();
   }

   public static Sql2008Configuration MsSql2008
   {
      get { return new Sql2008Configuration().Dialect<MsSql2008GeographyDialect>(); }
   }
}
Run Code Online (Sandbox Code Playgroud)

所以我有配置代码,如:

var configuration = Fluently.Configure()
  .Database(Sql2008Configuration.MsSql2008.ConnectionString(c => c.Is(connectionString)))
  .Mappings(m => m.FluentMappings
    .AddFromAssemblyOf<LocationLog>()
);
Run Code Online (Sandbox Code Playgroud)

所有这些都是为了设置我在尝试将LocationLog类型持久化到数据库时遇到以下错误的事实:

在执行用户定义的例程或聚合"geography"期间发生.NET Framework错误:System.ArgumentException:24204:空间参考标识符(SRID)无效.指定的SRID必须与sys.spatial_reference_systems目录视图中显示的受支持的SRID之一匹配.System.ArgumentException:在Microsoft.SqlServer.Types.SqlGeography.set_Srid(Int32值)的Microsoft.SqlServer.Types.SqlGeography.Read(BinaryReader r)在SqlGeography ::.DeserializeValidate(IntPtr,Int32,CClrLobContext*)

我已经阅读了以下有关如何配置和使用Nhibernate Spatial库的文章:

但似乎都没有帮助.任何有经验配置Nhibernate使用可以提供任何见解的空间地理类型的人都将非常感激.

Iai*_*ain 10

我在同一条船上,感谢你的开始,我得到了它(插入和读取空间数据).对于其他感兴趣的人,首先是GisSharpBlog.NetTopologySuite.Geometries.Point类在NetTopologySuite.dll中,它是nHibernate.Spatial下载的一部分.

其次,根据James的观点,确保将SRID设置为4326.

最后,地图需要如下所示:

Map(a => a.Location).CustomType(typeof(NHibernate.Spatial.Type.GeometryType));
Run Code Online (Sandbox Code Playgroud)

我正在使用地理,但我在某处读到使用GeometryType可能会起作用,它对我有效(我插入了一些点并在数据库中验证了它).我还读到最好为地理编写SQL查询,以便您可以使用特殊的SQL 2008 Spatial方法(而不是使用Criteria).