Ho quello che sembra essere un problema comune, ma non riesco a capire come ottenere il risultato desiderato. Ho un'entità annidata con le proprietà di navigazione definite su di esso come si vede nel seguente diagramma.Framework Entity, Inserimenti di massa e Mantenimento delle relazioni
La raccolta punti della mappa può potenzialmente essere abbastanza grande per un determinato MapLine e non ci può essere un numero piuttosto elevato di MapLines per un maplayer.
La domanda qui è qual è l'approccio migliore per ottenere un oggetto MapLayer inserito nel database utilizzando Entity Framework e mantenere comunque le relazioni definite dalle proprietà di navigazione?
Un'implementazione standard Entity Framework
dbContext.MapLayers.Add(mapLayer);
dbContext.SaveChanges();
provoca un picco di memoria e tempi di ritorno piuttosto scarsa.
Ho provato l'attuazione del EntityFramework.BulkInsert packagebut it does not honor the relationships of the objects.
Questo sembra che sarebbe un problema che qualcuno ha eseguito in prima, ma non posso sembrano trovare tutte le risorse che spiegano come eseguire questa operazione.
Aggiornamento
ho cercato di attuare il suggerimento fornito da Richard, ma non sono la comprensione di come vorrei andare a questo per un soggetto nidificato come quello che ho descritto. Sto correndo partendo dal presupposto che ho bisogno di inserire l'oggetto MapLayer, poi MapLines, poi MapPoints per onorare la relazione PF/FK nel database. Attualmente sto provando il seguente codice ma questo non sembra essere corretto.
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();
}
Aggiorna 2
Dopo aver provato diversi modi per raggiungere questo fine ho rinunciato e appena inserito il maplayer come entità e memorizzato il rapporto MapLines => MapPoints come stringa JSON crudo a un array di byte sull'entità MapLayer (poiché non sto interrogando su quelle strutture, questo funziona per me).
Come dice il proverbio "Non è bello, ma funziona".
Ho avuto un po 'di successo con il pacchetto BulkInsert e gestendo le relazioni al di fuori di EF, ma di nuovo si è imbattuto in un problema di memoria quando si tenta di utilizzare EF per reinserire i dati nel sistema. Sembra che attualmente EF non sia in grado di gestire in modo efficiente set di dati di grandi dimensioni e relazioni complesse.
Puoi spiegare che cosa stai facendo con i dati dopo? Mi interessa, se non è meglio usare semplicemente un semplice formato binario per i tuoi dati. –