Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SharpMap和实体框架:动态程序集中不支持调用的成员_C#_Entity Framework_Sharpmap_Winforms - Fatal编程技术网

C# SharpMap和实体框架:动态程序集中不支持调用的成员

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

我在一个定制的“地图小部件”组件中使用夏普地图。为了填充映射,我想使用实体框架,它位于一个单独的DLL中。如果我创建了一个地图,然后获取数据,这个方法就可以了

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
Domain.dll
  • 包含域模型和服务
  • 使用实体模型进行持久性
  • App.config包含connectionstring、实体框架配置部分和实体框架连接工厂

因此,我的问题是:

  • 为什么会这样
  • 我能做些什么来阻止它?(如果没有,是否有比Program.cs更好的地方来存放黑客代码)

  • 感谢阅读,如果我不清楚,请让我澄清。

    这很可能是由于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);