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
Hai raggiunto qualche risoluzione su questo? Sto incontrando lo stesso tipo di problema – jth41
Ho una nuova domanda qui: http://stackoverflow.com/questions/35236919/entity-framework-6-runtime-error-given-key-was-not-present- nel dizionario – jth41
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 –