2015-12-04 24 views
5

これはトレースが難しいことがわかりましたが、エンフォースフレームワーク6のテストにEffortを使用すると、KeyNotFoundException DBSetリポジトリの1つにアクセスしようとすると、「指定されたキーが辞書に存在しませんでした」というエラーが表示されます。DbSetにアクセスする際のエフォート(EF6)例外(指定されたキーが辞書に存在しません)

DbContextで1つまたは2つのDbSetsで動作することがわかりましたが、DbContextに複数のDbSetsを追加すると、上記のエラーが発生します。

例コード(これは私のコード全体を単純化したもので、DbContextからいくつかのDbSetsをコメントアウトしてから入れ直すとエラーがランダムに表示されます。モデルに部分クラスもありますが、また、そう)奇妙なようだ:

テスト

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

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

      } 

DBContextとDbSetsモデル

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

スタックトレース:

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

解決済みでしたか?私は同じ種類の問題に遭遇しています – jth41

+0

私はここに新しい質問があります:http://stackoverflow.com/questions/35236919/entity-framework-6-runtime-error-given-key-was-not-present- – jth41

+0

こんにちはjth41、いいえ、私は自分のカスタムSaveChangesメソッドのDbContextの周りにMoqとアダプタを使って、状態ではなく動作をチェックするためにユニットテストを変更しました。インストールされたSQL Serverインスタンスではなくインメモリデータベースを使用するEffortを使用している場合にのみ、この問題に気付きました。 –

答えて

0

私はまったく同じスタックトレースを持っているが、私には問題はEntity Frameworkのの継承TPTと関連していました。あなたもそれを使用している場合は、私の答えhereを見てみましょう。

1

私は正確な問題を抱えています。私はSQLの地理データ型をSQL 2014のデータベーステーブルのいくつかで使用していたので、それは現時点でサポートを追加する予定がないため、私は実際の過渡状態に陥ってしまいました。 EF6のための他のインメモリデータベースプロバイダを見つけることができません!

サポートされていない可能性のある新しい参照型フィールドが存在する可能性があります。

+1

更新 - 私はMoqをEntityFramework.Testing.Moq Nugetパッケージとともに使用し始めました。それは私のDbSetsを実装し、既存のDbContextクエリでメモリ内でクエリを実行するための模擬オブジェクトのIQueryableコレクションを作成することを可能にします。 – Breeno

関連する問題