C# SharpMap和实体框架:动态程序集中不支持调用的成员
我在一个定制的“地图小部件”组件中使用夏普地图。为了填充映射,我想使用实体框架,它位于一个单独的DLL中。如果我创建了一个地图,然后获取数据,这个方法就可以了C# SharpMap和实体框架:动态程序集中不支持调用的成员,c#,entity-framework,sharpmap,winforms,C#,Entity Framework,Sharpmap,Winforms,我在一个定制的“地图小部件”组件中使用夏普地图。为了填充映射,我想使用实体框架,它位于一个单独的DLL中。如果我创建了一个地图,然后获取数据,这个方法就可以了 public void loadMap() { var map = new MapWidget(); // Create a new widget which internally uses SharpMap map.AddCountriesLayer(); // Load the map background fro
public void loadMap() {
var map = new MapWidget(); // Create a new widget which internally uses SharpMap
map.AddCountriesLayer(); // Load the map background from .shp file
var data = new IPService.GetPointsForMap(); // Gets IP address from entity framework, inside "domain.dll"
map.AddDots(data); // Add dots
}
但是,如果我先获取数据,然后绘制地图,情况就会发生变化:
public void loadMap() {
var data = new IPService.GetPointsForMap(); // Accessing entity framework before sharpmap
var map = new MapWidget();
map.AddCountriesLayer();
map.AddDots(data);
}
导致
System.NotSupportedException "The invoked member is not supported in a dynamic assembly."
at System.Reflection.Emit.InternalAssemblyBuilder.GetExportedTypes()
at GeoAPI.GeometryServiceProvider.ReflectInstance()
at GeoAPI.GeometryServiceProvider.get_Instance()
at SharpMap.Data.Providers.ShapeFile.set_SRID(Int32 value) in C:\dev\DLLs\SharpMap Source\Trunk\SharpMap\Data\Providers\ShapeFile.cs:line 859
at SharpMap.Data.Providers.ShapeFile.ParseProjection() in C:\dev\DLLs\SharpMap Source\Trunk\SharpMap\Data\Providers\ShapeFile.cs:line 978
at SharpMap.Data.Providers.ShapeFile..ctor(String filename, Boolean fileBasedIndex) in C:\dev\DLLs\SharpMap Source\Trunk\SharpMap\Data\Providers\ShapeFile.cs:line 302
at Dashboard.Widgets.MapWidget.AddCountriesLayer() in c:\dev\Dashboard\v1\Dashboard\Classes\Widgets\Generic\MapWidget.cs:line 86
这到底是怎么回事?为什么使用实体框架首先会打破它
为了解决这个问题,我将其添加到program.cs中,以强制首先加载小部件
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// Hack to force SharpMap to register before entity framework
var widget = new Widgets.MapWidget();
widget.Update();
Application.Run(new DashboardForm());
}
然而,我不喜欢它——它看起来很脆弱,我不喜欢“巧合编码”。我能帮你修一下吗
注:
我发现这篇博文:
我将域程序集添加到connectionString
我的项目结构如下:
Dashboard.exe
- App.Config包含connectionstring
- 参考夏普地图
- 引用域.Dll
- 包含MapWidget
- 包含域模型和服务
- 使用实体模型进行持久性
- App.config包含connectionstring、实体框架配置部分和实体框架连接工厂
因此,我的问题是:
感谢阅读,如果我不清楚,请让我澄清。这很可能是由于EF生成的动态代理。我不熟悉SharpMap,因此我无法评论在EF之前初始化它会产生什么影响,但您应该能够通过禁用代理创建来避免异常:
context.Configuration.ProxyCreationEnabled = false;
请注意,这将禁用延迟加载和更改跟踪,因此请首先仔细阅读本文:我有一个非常类似的问题,但我没有使用实体框架(我使用的是NHibernate),因此,我发现这毕竟可能不是代理对象问题 我也不喜欢“巧合编码”,但我假设通过调用
new MapWidget()
,一些与GeoApi相关的初始化会在内部执行,就像SharpMap在内部使用GeoApi一样
在我的例子中,我没有直接使用地图,我只是使用NHibernate在我的数据库中插入了一些地理数据,我得到了完全相同的堆栈跟踪,所以我认为这可能是相同的问题
虽然我很讨厌它,但我有这样的想法:
// my object to be persisted using NHibernate
var myObj = new MyObj();
// add polygon of type GeoAPI.Geometries.IGeometry
myObj.CoveredArea = myGeoFactory.CreatePolygonArea(/* ... */);
// use NHibernate to save my obj
sessioNScope.Save(myObj); // <- throws NotSupportedException here
效果很好。在我的例子中,我使用了newmap()
而不是newmapwidget()
,因为它是一个应用程序
TLDR:将其视为一种执行初始化的黑客行为我很遗憾+1此b/c似乎没有其他解决方案。我脑子里还是个问题。
// Ignore this line: hack to initialize GeoApi
new Map();
// my object to be persisted using NHibernate
var myObj = new MyObj();
// add polygon of type GeoAPI.Geometries.IGeometry
myObj.CoveredArea = myGeoFactory.CreatePolygonArea(/* ... */);
// use NHibernate to save my obj
sessioNScope.Save(myObj);