私は共通の問題であるように思えますが、希望の結果を達成する方法を理解することはできません。次の図に示すように、ナビゲーションプロパティが定義された入れ子のエンティティがあります。エンティティフレームワーク、一括挿入、およびリレーションシップの維持
マップ点の集合は、潜在的に、所与のMapLineため非常に大きくすることができ、にMapLayerためMapLinesのかなり多数が存在し得ます。
ここで問題となるのは、MapLayerオブジェクトをEntity Frameworkを使用してデータベースに挿入し、ナビゲーションプロパティで定義された関係を維持するための最良の方法です。
標準のEntity Frameworkの実装
dbContext.MapLayers.Add(mapLayer);
dbContext.SaveChanges();
は、大容量メモリのスパイクとかなり貧弱なリターン時間が発生します。
私は誰かが前に遭遇したことが問題になりますが、私はこのタスクを実行する方法を説明任意のリソースを見つけるように見えるカントのようにこれはそうEntityFramework.BulkInsert packagebut it does not honor the relationships of the objects.
を実装しようとしています。
アップデートは
私はリチャードが提供する提案を実装しようとしたが、私は、そのような私が説明した一人として、ネストされたエンティティのためにこれについて行くだろうか理解していないのです。私は、MapLayerオブジェクト、次にMapLines、MapPointsを挿入してデータベースのPF/FK関係を尊重する必要があるという前提の下で実行しています。私は現在、次のコードを試していますが、これは正しいとは思われません。これを達成するために、複数の異なる方法を試した後
dbContext.MapLayers.Add(mapLayer);
dbContext.SaveChanges();
List<MapLine> mapLines = new List<MapLine>();
List<MapPoint> mapPoints = new List<MapPoint>();
foreach (MapLine mapLine in mapLayer.MapLines)
{
//Update the mapPoints.MapLine properties to reflect the current line object
var updatedLines = mapLine.MapPoints.Select(x => { x.MapLine = mapLine; return x; }).ToList();
mapLines.AddRange(updatedLines);
}
using (TransactionScope scope = new TransactionScope())
{
MyDbContext context = null;
try
{
context = new MyDbContext();
context.Configuration.AutoDetectChangesEnabled = false;
int count = 0;
foreach (var entityToInsert in mapLines)
{
++count;
context = AddToContext(context, entityToInsert, count, 100, true);
}
context.SaveChanges();
}
finally
{
if (context != null)
context.Dispose();
}
scope.Complete();
}
アップデート2
私は最終的にあきらめ、ちょうどエンティティようにMapLayerを挿入し、内生のJSON文字列としてMapLines => MapPoints関係が記憶されていますMapLayerエンティティのバイト配列(これは私にとってはうまく機能する構造に対してクエリを実行していません)。
「いいですね、でもうまくいきます。
BulkInsertパッケージとEF以外の関係を管理することで成功しましたが、EFを使用してデータをシステムに戻そうとするとメモリの問題が発生しました。現在、EFは大規模なデータセットと複雑な関係を効率的に処理できません。
データの後に何をしているのか説明できますか?あなたのデータにシンプルなバイナリフォーマットを使用するほうが良いのではないかと心配しています。 –