我使用的是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>;
}
}表列为“Geography`”
但是,它出错的原因是
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”或其依赖项之一。系统找不到指定的文件。
我参与了一个单独的项目,在这个项目中,我按照代码约定使用了映射,并且它不需要任何Antrl.Runtime引用就可以工作。
需要帮助指出正确的方向..。
发布于 2014-10-08 12:41:44
作为一个单独的示例项目,我尝试了一些在实际的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使用NetTopologicalSuite,它本身是GeoAPI的派生,GeoAPI库定义了接口GeoAPI.Geometries,在加载/搜索当前项目中的正确实现时,由于MVC项目中的Antlr错误而失败。
但是,它能够在单独的示例项目中获取NetTopologySuite.NtsGeometryServices实现。GeoAPI中搜索实现的实际代码如下
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");
}
}当在几何图形上设置SRID时,会调用这个选项。我猜想我的MVC项目引用了一个程序集,该程序集使得这个程序集看起来像Antlr。有人建议为更新的Antlr程序集添加重定向。我也试过了,但错误仍在重复。
https://stackoverflow.com/questions/26048240
复制相似问题