これはトレースが難しいことがわかりましたが、エンフォースフレームワーク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
解決済みでしたか?私は同じ種類の問題に遭遇しています – jth41
私はここに新しい質問があります:http://stackoverflow.com/questions/35236919/entity-framework-6-runtime-error-given-key-was-not-present- – jth41
こんにちはjth41、いいえ、私は自分のカスタムSaveChangesメソッドのDbContextの周りにMoqとアダプタを使って、状態ではなく動作をチェックするためにユニットテストを変更しました。インストールされたSQL Serverインスタンスではなくインメモリデータベースを使用するEffortを使用している場合にのみ、この問題に気付きました。 –