3

カスタムの「マップウィジェット」コンポーネント内でシャープマップを使用しています。マップにデータを入力するには、別の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());
}

しかし、私はそれが好きではありません-それはかなり壊れやすいようで、「偶然の一致によるコーディング」は好きではありません。それを修正するために私にできることはありますか?

ノート:

私はこのブログ投稿を見つけました:http://elegantcode.com/2010/01/28/the-entity-framework-and-the-the-invoked-member-is-not-supported-in-a-dynamic-assembly-例外/ ドメインアセンブリをconnectionStringに追加しました

私のプロジェクト構造は次のとおりです。

Dashboard.exe

  • App.Configには接続文字列が含まれています
  • 参照SharpMap
  • Domain.Dllを参照します
  • MapWidgetが含まれています

Domain.dll

  • DomainModelとサービスが含まれています
  • 永続性のためにエンティティモデルを使用します
  • App.configには、connectionstring、entity Framework構成セクション、およびEntityFramework接続ファクトリが含まれています

だから私の質問は:

  1. なぜそれが起こっているのですか?
  2. それを止めるために私は何ができますか?(そうでない場合は、ハッキーコード用のProgram.csよりも良い場所があります)

読んでくれてありがとう、はっきりしていないかどうかはっきりさせてください。

4

2 に答える 2

2

非常によく似た問題がありましたが、Entity Frameworkを使用していません(代わりに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

そしてそれはあなたが持っていたように私に正確な例外を与えました。に変更した後

// 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);

それはうまくいきました。私の場合、 アプリケーションであるため、new Map()代わりに使用しました。new MapWidget()

TLDR:初期化を実行するハックと考えてください

于 2013-11-12T17:06:06.043 に答える
1

これは、EFによって生成された動的プロキシが原因である可能性があります。私はSharpMapに精通していないため、EFの前に初期化する必要がある効果についてコメントすることはできませんが、プロキシの作成を無効にすることで例外を回避できるはずです。

context.Configuration.ProxyCreationEnabled = false;

これにより遅延読み込みと変更の追跡が無効になることに注意してください。最初にこの記事を注意深く読んでください:http://msdn.microsoft.com/en-us/data/jj592886

于 2013-03-12T20:51:44.323 に答える