2015-12-04 19 views
5

To może być trochę trudne do wyśledzenia, ale przy użyciu narzędzia Wysiłek do testowania architektury Entity Framework 6 wydaje mi się, że uzyskano wyjątek KeyNotFoundException ("Podany klucz nie był obecny w słowniku") błąd podczas próby uzyskania dostępu do jednego z repozytoriów DBSet.Wyjątek w wysiłku (EF6) podczas uzyskiwania dostępu do narzędzia DbSet (Podany klucz nie występuje w słowniku)

Zauważyłem, że działa z jednym lub dwoma DbSets w DbContext, ale gdy zaczynam dodawać wiele DbSets do DbContext, otrzymuję powyższy błąd.

Przykładowy kod (jest to uproszczenie całego mojego kodu, błąd wydaje się losowy, gdy skomentuję niektóre DbSets z DbContext, a następnie umieszczam je z powrotem. Mam również częściowe klasy na modelach, ale im się to udaje czasami też, więc wydaje się dziwne):

test

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

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

      } 

DBContext i DbSets modele

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; } 
    } 

stosu Ślad:

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

Czy osiągnąłeś jakąkolwiek rezolucję w tej sprawie? Występuje w tym samym rodzaju problemu – jth41

+0

Mam nowe pytanie tutaj: http://stackoverflow.com/questions/35236919/entity-framework-6-runtime-error-given-key-was-not-present- w słowniku – jth41

+0

Hi jth41, nie, zmieniłem testy jednostek, aby sprawdzić zachowanie zamiast stanu, używając Moq i adaptera wokół DbContext dla własnych niestandardowych metod SaveChanges. Zauważyłem ten problem tylko przy użyciu narzędzia Effort, które korzysta z bazy danych w pamięci, a nie z zainstalowanej instancji SQL Server. Aktualizacja –

Odpowiedz

0

Mam dokładnie ten sam ślad stosu, ale problem dla mnie było związane z dziedziczenie TPT z Entity Framework. Jeśli też go używasz, spójrz na moją odpowiedź: here.

1

Mam dokładnie problem. Okazało się, że to dlatego, że używałem typu danych geograficznych SQL w niektórych tabelach bazy danych SQL 2014 i wysiłku doesn't support this data type i nie planuję w tej chwili dodawać do niego obsługi, co pozostawia mnie w prawdziwym quandry, ponieważ nie można znaleźć żadnego innego dostawcy baz danych w pamięci dla EF6, który to robi!

Możliwe, że istnieją inne nowsze pola typów odniesienia, które również nie obsługują, nie jestem pewien.

+1

- Zacząłem używać Moq razem z pakietem EntityFramework.Testing.Moq Nuget z dużym sukcesem. Pozwala mi tworzyć kolekcje IQueryable wyśmianych obiektów, aby zapełnić moje DbSety i przesłać je do pamięci za pomocą moich istniejących zapytań DbContext, bez żadnych problemów. – Breeno

Powiązane problemy