2015-12-04 20 views
5

Ciò si sta rivelando un po 'difficile da rintracciare, ma quando si utilizza Effort per testare Entity Framework 6, sembra che si ottenga un KeyNotFoundException (Errore "La chiave fornita non era presente nel dizionario") durante il tentativo di accedere a uno dei repository DBSet.Eccezione Sforzo (EF6) quando si accede a DbSet (la chiave specificata non era presente nel dizionario)

Ho notato che funziona con uno o due DbSet nel DbContext, ma quando comincio ad aggiungere più DbSet a DbContext, ricevo l'errore sopra riportato.

Codice di esempio (questa è una semplificazione del mio intero codice, l'errore sembra casuale quando commento alcuni DbSet dal DbContext e poi li rimetto. Ho anche classi parziali sui modelli, ma a volte succede a questi inoltre, così sembra strano):

prova

  [Fact] 
      public void MyTest() 
      { 
       var connection = Effort.DbConnectionFactory.CreateTransient(); 
       var context = new StubDbContext(connection); 

       var count = context.Models1.Count(); 
       Assert.Equal(count, 0); 

      } 

DbContext e DbSets modelle

public class StubEntityModelA 
    { 
     [Key] 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 

    public class StubEntityModelB 
    { 
     [Key] 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 

    public class StubEntityModelC 
    { 
     [Key] 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 

    public class StubDbContext : DbContext 
    { 
     public StubDbContext(DbConnection connection): base(connection, true) 
     { 
     } 
     public virtual DbSet<StubEntityModelA> Models1 { get; set; } 
     public virtual DbSet<StubEntityModelB> Models2 { get; set; } 
     public virtual DbSet<StubEntityModelC> Models3 { get; set; } 
    } 

dello stack:

at System.Collections.Generic.Dictionary`2.get_Item(TKey key) 
    at Effort.Provider.EffortProviderManifest.GetStoreType(TypeUsage edmType) 
    at System.Data.Entity.ModelConfiguration.Edm.Services.StructuralTypeMappingGenerator.MapTableColumn(EdmProperty property, String columnName, Boolean isInstancePropertyOnDerivedType) 
    at System.Data.Entity.ModelConfiguration.Edm.Services.PropertyMappingGenerator.Generate(EntityType entityType, IEnumerable`1 properties, EntitySetMapping entitySetMapping, MappingFragment entityTypeMappingFragment, IList`1 propertyPath, Boolean createNewColumn) 
    at System.Data.Entity.ModelConfiguration.Edm.Services.TableMappingGenerator.Generate(EntityType entityType, DbDatabaseMapping databaseMapping) 
    at System.Data.Entity.ModelConfiguration.Edm.Services.DatabaseMappingGenerator.GenerateEntityTypes(DbDatabaseMapping databaseMapping) 
    at System.Data.Entity.ModelConfiguration.Edm.Services.DatabaseMappingGenerator.Generate(EdmModel conceptualModel) 
    at System.Data.Entity.DbModelBuilder.Build(DbProviderManifest providerManifest, DbProviderInfo providerInfo) 
    at System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection) 
    at System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext) 
    at System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input) 
    at System.Data.Entity.Internal.LazyInternalContext.InitializeContext() 
    at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) 
    at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize() 
    at System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext() 
    at System.Data.Entity.Infrastructure.DbQuery`1.System.Linq.IQueryable.get_Provider() 
    at System.Linq.Queryable.Count[TSource](IQueryable`1 source) 
    at XXXX.Business.Test.XXXXTests.IXXXXXXMethod.ShouldInsertRecordWhenNoneAlreadyExist() in C:\Workspaces\XXX\XXXXX\XXXXX.Business.Test\XXXXXXTests.cs:line 125 
+1

Hai raggiunto qualche risoluzione su questo? Sto incontrando lo stesso tipo di problema – jth41

+0

Ho una nuova domanda qui: http://stackoverflow.com/questions/35236919/entity-framework-6-runtime-error-given-key-was-not-present- nel dizionario – jth41

+0

Hi jth41, no, ho finito per cambiare i miei test unitari per verificare il comportamento piuttosto che lo stato, usando Moq e un adattatore attorno a DbContext per i miei metodi SaveChanges personalizzati. Ho notato questo problema solo durante l'uso di Effort che utilizza un database in memoria anziché un'istanza di SQL Server installata. Aggiornamento –

risposta

0

ho avuto la stessa identica analisi dello stack, ma il problema per me è stata correlata con l'eredità TPT di Entity Framework. Se lo stai usando anche tu, dai un'occhiata alla mia risposta here.

1

Sto avendo il problema esatto. È venuto fuori perché stavo usando il tipo di dati geografici SQL in alcune delle mie tabelle del database SQL 2014, e lo sforzo doesn't support this data type, e non ci sono piani per aggiungere il supporto per esso al momento sia, che mi lascia in una vera quandry come io non riesce a trovare nessun altro provider di database in memoria per EF6 che lo fa!

Potrebbero esserci altri campi di tipo di riferimento più recenti che non supporta, non sono sicuri.

+1

- Ho iniziato a utilizzare Moq insieme al pacchetto EntityFramework.Testing.Moq Nuget con notevole successo. Mi consente di creare raccolte IQueryable di oggetti mocked per popolare i miei DbSet e interrogarli in memoria con le mie query DbContext esistenti, nessun problema finora. – Breeno

Problemi correlati