NHibernate Spatial Mapping返回Antrl错误

时间:2014-09-25 21:15:44

标签: nhibernate spatial fluent-nhibernate-mapping

我正在使用NHibernate 3.3。我有一个案例,我想插入一个未被引用的计算列。

我的域名实体可以缩减为

格式
    public class Location
    {
         public virtual IPoint GeoLocation {get;set;}
    }

    public class MappingOverride : IAutoMappingOverride<Location>
    {
        public void Override(AutoMapping<Location> mapping)
        {
            mapping
              .Map(e => e.GeoLocation)
              .Column("GeoLocation")
              .CustomSqlType("geography")
               .CustomType<MsSql2008GeographyType>;
        }
    }

表格列的类型为“地理位置”

然而它出错了

   at System.Reflection.RuntimeAssembly.GetExportedTypes(RuntimeAssembly assembly, ObjectHandleOnStack retTypes)
   at System.Reflection.RuntimeAssembly.GetExportedTypes()
   at GeoAPI.GeometryServiceProvider.GetLoadableTypes(Assembly assembly)
   at GeoAPI.GeometryServiceProvider.ReflectInstance()
   at GeoAPI.GeometryServiceProvider.get_Instance()
   at NetTopologySuite.Geometries.Geometry.set_SRID(Int32 value)

它说它需要Antrl.Runtime,但它是一个非常古老的版本。所有Antrl.Runtime nuget包都有不同的程序集标识符。

  

无法加载文件或程序集'antlr.runtime,Version = 2.7.6.2,Culture = neutral,PublicKeyToken = 1790ba318ebc5d56'或其依赖项之一。系统找不到指定的文件。

我参与了一个单独的项目,我使用了map by code约定,它的工作原理没有引用Antrl.Runtime

需要帮助指出自己正确的方向......

1 个答案:

答案 0 :(得分:1)

作为一个单独的示例项目,我尝试了一些有用的东西,在实际的ASP.NET MVC项目中没有工作。

类的定义

public class Location : IEntity
{
    public virtual int Id { get; protected set; }

    public virtual string LocationName { get; set; }

    public virtual IPoint GeoLocation { get; set; }
}

映射

public class LocationMapping : IAutoMappingOverride<Location>
{
    public void Override(AutoMapping<Location> mapping)
    {
        mapping.Map(x => x.LocationName).Column("Name");
        mapping.Map(x => x.GeoLocation).Column("GeoLocation")
               .CustomType<MsSql2008GeographyType>();
    }
}

测试

public class WhenSavingGeoLocation : BasePersistanceTest
    {
        [Test]
        public void Save()
        {
            this.Session
             .SaveOrUpdate(new Location { 
                   LocationName = "Category 01", 
                   GeoLocation = new Point(-72.12, 32.2323234) {  SRID = 4326 } 
            });
        }
    }

NHibernate.Spatial使用NetTopologicalSuiteGeoAPI本身是GeoAPI.Geometries的衍生物 GeoAPI库定义了一个接口NetTopologySuite.NtsGeometryServices,当加载/搜索当前项目中的正确实现时,MVC项目中的Antlr错误失败。

然而,它能够在单独的示例项目中获取 private static IGeometryServices ReflectInstance() { #if !PCL var a = AppDomain.CurrentDomain.GetAssemblies(); foreach (var assembly in a) { // Take a look at issue 114: http://code.google.com/p/nettopologysuite/issues/detail?id=114 if (assembly is System.Reflection.Emit.AssemblyBuilder) continue; if (assembly.GetType().FullName == "System.Reflection.Emit.InternalAssemblyBuilder") continue; if (assembly.GlobalAssemblyCache && assembly.CodeBase == Assembly.GetExecutingAssembly().CodeBase) continue; foreach (var t in GetLoadableTypes(assembly)) { if (t.IsInterface) continue; if (t.IsAbstract) continue; if (t.IsNotPublic) continue; if (!typeof(IGeometryServices).IsAssignableFrom(t)) continue; var constuctors = t.GetConstructors(); foreach (var constructorInfo in constuctors) { if (constructorInfo.IsPublic && constructorInfo.GetParameters().Length == 0) return (IGeometryServices)Activator.CreateInstance(t); } } } #endif throw new InvalidOperationException("Cannot use GeometryServiceProvider without an assigned IGeometryServices class"); } } 实现。搜索实现的GeoAPI中的实际代码如

{{1}}

在几何体上设置SRID时会调用此方法。我猜我的MVC项目有一个程序集的引用,这使得它看起来像Antlr。 有一些建议为新的Antlr程序集添加重定向。我也试过了,但错误仍然不断重复。