访问DbSet时出现Effort(EF6)异常(字典中不存在给定的键)



事实证明,这有点难以追踪,但当使用Effort测试Entity Framework 6时,我在尝试访问其中一个DBSet存储库时,似乎遇到了KeyNotFoundException("给定的密钥不在字典中")错误。

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

示例代码(这是我整个代码的简化,当我从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:WorkspacesXXXXXXXXXXXXX.Business.TestXXXXXXTests.cs:line 125

我遇到了确切的问题。事实证明,这是因为我在我的一些SQL 2014数据库表中使用了SQL地理数据类型,而且我的工作不支持这种数据类型,目前也没有增加对它的支持的计划,这让我陷入了一个真正的困境,因为我找不到任何其他用于EF6的内存中数据库提供程序!

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

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

相关内容

最新更新