2015-12-04 13 views
5

Bu, izlenmesi biraz zor olduğunu kanıtlıyor, ancak Entity Framework 6 test için Çaba kullanırken, bir KeyNotFoundException alıyor gibi görünüyor DBSet depolarından birine erişmeye çalışırken ("Verilen anahtar sözlükte mevcut değildi") hatası.DbSet'e erişirken çaba (EF6) istisnası (Verilen anahtar sözlüğünde mevcut değildi)

DbContext'te bir veya iki DbSet ile çalıştığını fark ettim, ancak DbContext'e birden çok DbSet eklemeye başladığımda, yukarıdaki hatayı alıyorum.

Örnek kod (bu, tüm kodun bir basitleştirilmesidir, DbSontext'ten bazı DbSet'leri açıkladığımda ve daha sonra da tekrar yerleştirdiğimde hata rastgele görünüyor. Ayrıca modellerde kısmi sınıflar var, ancak bazen bunları başarılı oluyor Ayrıca, bu yüzden) garip görünüyor:

Testi

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

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

      } 

DBContext ve DbSets Modelleri

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

Yığın İzleme:

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

Bu konuda herhangi bir çözünürlüğe ulaştınız mı? Ben aynı tür bir sorunla karşılaşıyorum – jth41

+0

Burada yeni bir sorum var: http://stackoverflow.com/questions/35236919/entity-framework-6-runtime-error-given-key-was-not-present- in-the-sözlük – jth41

+0

Merhaba jth41, hayır, ben benim durum testlerimi değiştirmek yerine Moq ve DbContext etrafında bir adaptör kullanarak kendi özel SaveChanges yöntemleri için durum yerine kontrol edin. Sadece yüklü bir SQL Server örneği yerine bir bellek içi veritabanı kullanan Effort kullanırken bu sorunu fark ettim. –

cevap

0

Ben aynı yığın izleme var, ama bana sorun Varlık Framework miras TPT ile ilgiliydi. Bunu da kullanıyorsanız, yanıtım here'a bakın.

1

Kesin sorun yaşıyorum. Bazı SQL 2014 veritabanı tablolarımdaki SQL geography veri tipini ve doesn't support this data type eforunu kullandığımdan ve şu an için destek eklemeye yönelik bir planım olmadığı için beni gerçek bir taşrada bıraktığımdan çıktı. EF6 için başka bir bellek içi veritabanı sağlayıcısı bulamıyor!

Potansiyel olarak desteklemediği diğer yeni referans türü alanları olabilir, emin değil.

+1

Güncelleştirmesi - Önemli başarı ile EntityFramework.Testing.Moq Nuget paketi ile birlikte Moq kullanmaya başladım. Benim DbSets ile doldurmak ve mevcut DbContext sorguları ile bellek içi sorgulamak için alay edilmemiş nesnelerin IQueryable koleksiyonları oluşturmama izin veriyor, şimdiye kadar hiç sorun yok. – Breeno

İlgili konular