Исключение Effort (EF6) при доступе к DbSet (данный ключ отсутствовал в словаре)

Это оказывается немного сложно отследить, но при использовании Effort для тестирования Entity Framework 6 я, кажется, получаю ошибку KeyNotFoundException («данный ключ не присутствовал в словаре») при попытке получить доступ к одному из DBSet репозитории.

Я заметил, что он работает с одним или двумя наборами DbSet в DbContext, но как только я начинаю добавлять несколько наборов DbSet в DbContext, я получаю указанную выше ошибку.

Пример кода (это упрощение всего моего кода, ошибка кажется случайной, когда я комментирую некоторые DbSet из DbContext, а затем возвращаю их обратно. У меня также есть частичные классы для моделей, но иногда это также удается, поэтому кажется странный):

Проверить

            [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

person Stefan Zvonar    schedule 04.12.2015    source источник
comment
Вы пришли к какому-либо решению по этому поводу? Я сталкиваюсь с такой же проблемой   -  person jth41    schedule 06.02.2016
comment
У меня здесь новый вопрос: stackoverflow.com/questions/35236919/   -  person jth41    schedule 06.02.2016
comment
Привет, jth41, нет, в итоге я изменил свои модульные тесты, чтобы проверить поведение, а не состояние, используя Moq и адаптер вокруг DbContext для моих собственных пользовательских методов SaveChanges. Я заметил эту проблему только при использовании Effort, который использует базу данных в памяти, а не установленный экземпляр SQL Server.   -  person Stefan Zvonar    schedule 07.02.2016


Ответы (2)


У меня точно проблема. Оказалось, это произошло потому, что я использовал тип данных SQL geography в некоторых таблицах базы данных SQL 2014, и усилия не поддерживает этот тип данных, и в настоящее время нет планов по его добавлению, что ставит меня в затруднительное положение, поскольку я не могу найти другого поставщика баз данных в памяти для EF6, который делает!

Потенциально могут быть другие новые поля ссылочного типа, которые он также не поддерживает, не уверен.

person Breeno    schedule 18.11.2016
comment
Обновление. Я начал использовать Moq вместе с пакетом EntityFramework.Testing.Moq Nuget со значительным успехом. Это позволяет мне создавать IQueryable коллекции фиктивных объектов для заполнения моих DbSet и запрашивать их в памяти с моими существующими запросами DbContext, пока никаких проблем. - person Breeno; 23.11.2016
comment
Привет @Breeno, приведите пример кода того, как EntityFramework.Testing.Moq решил вашу проблему. Спасибо - person Jeremiah Flaga; 05.08.2019

У меня точно такая же трассировка стека, но проблема для меня была связана с наследованием TPT Entity Framework. Если вы тоже его используете, взгляните на мой ответ здесь.

person fabriciorissetto    schedule 20.04.2016