【问题标题】:Effort (EF6) exception when accessing DbSet (The given key was not present in the dictionary)访问 DbSet 时出现 Effort (EF6) 异常(字​​典中不存在给定键)
【发布时间】:2016-11-18 23:44:09
【问题描述】:

这被证明有点难以追查,但是在使用 Effort 测试 Entity Framework 6 时,我似乎在尝试访问时遇到 KeyNotFoundException(“字典中不存在给定的键”)错误的 DBSet 存储库。

我注意到它适用于 DbContext 中的一两个 DbSet,但是一旦我开始向 DbContext 添加多个 DbSet,就会收到上述错误。

示例代码(这是我整个代码的简化,当我从 DbContext 中注释掉一些 DbSet 然后将它们放回时,错误似乎是随机的。我在模型上也有部分类,但有时也会成功,所以看起来很奇怪):

测试

            [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,不,我最终更改了我的单元测试以检查行为而不是状态,使用 Moq 和 DbContext 周围的适配器为我自己的自定义 SaveChanges 方法。我只在使用 Effort 时才注意到这个问题,它使用内存数据库而不是安装的 SQL Server 实例。

标签: .net entity-framework linq entity-framework-6 effort


【解决方案1】:

我遇到了确切的问题。原来是因为我在我的一些 SQL 2014 数据库表中使用了 SQL 地理数据类型,并且努力 doesn't support this data type,而且目前也没有计划添加对它的支持,这让我陷入了困境因为我找不到任何其他适用于 EF6 的内存数据库提供程序!

可能还有其他较新的引用类型字段,它也不支持,不确定。

【讨论】:

  • 更新 - 我已经开始使用 Moq 以及 EntityFramework.Testing.Moq Nuget 包并取得了相当大的成功。它允许我创建模拟对象的 IQueryable 集合来填充我的 DbSet,并使用我现有的 DbContext 查询在内存中查询它,到目前为止没有问题。
  • 嗨@Breeno,请举例说明EntityFramework.Testing.Moq如何解决您的问题的代码。谢谢
【解决方案2】:

我得到了完全相同的堆栈跟踪,但我的问题与实体框架的继承 TPT 有关。如果你也在用,看看我的回答here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    相关资源
    最近更新 更多