Sto usando EF6
e, a causa della bassa velocità del metodo AddRange()
, devo usare BulkInsert
. Quindi ho aggiunto il pacchetto NuGet di BulkInsert per EF6 tramite here.Entity Framework Bulk Insert Throws KeyNotFoundException error
La prima cosa che ho ricevuto dopo aver aggiunto le dll
s era questo avvertimento:
conflitti Trovato tra le diverse versioni dello stesso assembly dipendente. Impostare la proprietà "AutoGenerateBindingRedirects" su true nel file di progetto.
ho fatto un List
di tutti i miei Contact
entità cioè contactsToInsert che devono essere aggiunti (I miei contatti hanno una chiave esterna in un'altra tabella, anche). Quando ho provato a eseguire il seguente codice, ricevo un KeyNotFoundException
che afferma "La chiave specificata non era presente nel dizionario".
using (var db = new Entities(myConnectionString))
{
db.BulkInsert(contactsToInsert);
db.SaveChanges();
}
NB. Sto eseguendo BulkInsert all'interno di BackgroundWorker
. Potrebbe essere questa la causa del problema a giudicare dallo this fix?
StackTrace:
at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
at EntityFramework.MappingAPI.Mappers.MapperBase.BindForeignKeys() in c:\dev\EntityFramework.MappingAPI\trunk\src\EntityFramework.MappingAPI\Mappers\MapperBase.cs:line 603
at EntityFramework.MappingAPI.Mappings.DbMapping..ctor(DbContext context) in c:\dev\EntityFramework.MappingAPI\trunk\src\EntityFramework.MappingAPI\Mappings\DbMapping.cs:line 101
at EntityFramework.MappingAPI.EfMap.Get(DbContext context) in c:\dev\EntityFramework.MappingAPI\trunk\src\EntityFramework.MappingAPI\EfMap.cs:line 60
at EntityFramework.MappingAPI.Extensions.MappingApiExtensions.Db(DbContext ctx, Type type) in c:\dev\EntityFramework.MappingAPI\trunk\src\EntityFramework.MappingAPI\Extensions\MappingApiExtensions.cs:line 51
at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector)
at EntityFramework.BulkInsert.Helpers.MappedDataReader`1..ctor(IEnumerable`1 enumerable, IEfBulkInsertProvider provider) in c:\dev\EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Helpers\MappedDataReader.cs:line 58
at EntityFramework.BulkInsert.Providers.EfSqlBulkInsertProviderWithMappedDataReader.Run[T](IEnumerable`1 entities, SqlTransaction transaction, BulkInsertOptions options) in c:\dev\EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Providers\EfSqlBulkInsertProviderWithMappedDataReader.cs:line 22
at EntityFramework.BulkInsert.Providers.ProviderBase`2.Run[T](IEnumerable`1 entities, IDbTransaction transaction, BulkInsertOptions options) in c:\dev\EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Providers\ProviderBase.cs:line 77
at EntityFramework.BulkInsert.Providers.ProviderBase`2.Run[T](IEnumerable`1 entities, BulkInsertOptions options) in c:\dev\EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Providers\ProviderBase.cs:line 109
at EntityFramework.BulkInsert.Extensions.BulkInsertExtension.BulkInsert[T](DbContext context, IEnumerable`1 entities, SqlBulkCopyOptions sqlBulkCopyOptions, Nullable`1 batchSize) in c:\dev\EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Extensions\BulkInsertExtension.cs:line 95
at EntityFramework.BulkInsert.Extensions.BulkInsertExtension.BulkInsert[T](DbContext context, IEnumerable`1 entities, Nullable`1 batchSize) in c:\dev\EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Extensions\BulkInsertExtension.cs:line 75
at Prospect.Update.bw_DoWork(Object sender, DoWorkEventArgs e) in c:\Users\pedram.mobedi\Documents\Visual Studio 2013\Projects\Prospect\Update.cs:line 546
at System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument)
ho incontrato la cosa esatta, e non sono stati in grado di trovare una correzione per questo. In definitiva, ho dovuto creare un secondo contesto EF senza proprietà di navigazione e solo la classe che sto cercando di inserire usando BulkInsert. Questa è solo una soluzione, e non è certamente una correzione, ma mi ha permesso di continuare a lavorare. –
Hai controllato le versioni recenti che funzionano con 6.1.3. Ho usato le librerie per alcuni progetti ora, nessun problema finora :) Un altro punto: puoi fornire la definizione della classe Contact? –