我有什麼似乎是一個常見問題,但我不知道如何實現預期的結果。我有一個定義了導航屬性的嵌套實體,如下圖所示。實體框架,批量插入和維護關係
地圖點收集有可能成爲一個給定MapLine非常大,可以有相當大量MapLines的MapLayer的。
這裏的問題是什麼是使用實體框架將MapLayer對象插入到數據庫中並保持由導航屬性定義的關係的最佳方法?
標準的實體框架實現
dbContext.MapLayers.Add(mapLayer);
dbContext.SaveChanges();
導致大量內存棘返回時間相當差。
我曾嘗試實施EntityFramework.BulkInsert packagebut it does not honor the relationships of the objects.
這似乎將是某人以前曾經遇到一個問題,但我似乎無法找到解釋如何完成這個任務的任何資源。
更新
我試圖實現由Richard提供的建議,但我不理解我怎麼會去這個嵌套的實體,如我所描述的一個。我假設我需要插入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作爲一個實體並存儲在MapLines => MapPoints關係如在原始JSON串MapLayer實體上的一個字節數組(因爲我沒有查詢這些結構對我有用)。
俗話說「它不漂亮,但它有效」。
我確實對BulkInsert包和管理EF外部的關係有了一些成功,但在嘗試使用EF將數據拉回到系統時又遇到了內存問題。目前看來,EF無法有效處理大型數據集和複雜關係。
你能解釋你在用數據後綴做什麼嗎?我感興趣的是,如果僅僅爲數據使用簡單的二進制格式不是更好。 –