Исключение исключения context.EnsureCreated() - уже таблица с именем

Создание модульных тестов с помощью Sqlite InMemory дает исключения с и без SureCreated(). Я тестирую базу данных MS Northwind.

Если я вызываю sureCreated(), выдается исключение «Microsoft.Data.Sqlite.SqliteException: SQLite Error 1: 'уже есть таблица с именем Region'».

Насколько я понимаю, SureCreated() попытается создать базу данных только в том случае, если она еще не создана.

Похоже, что он уже создал БД, поэтому я попытался удалить этот вызов, который позже привел к исключению, потому что таблиц не существовало. Итак, я получаю исключения с SureCreated() и без таблиц.

Я уже проверил context.OnModelCreating, и таблица «Регион» определена только один раз.

Обратите внимание, что это прекрасно работает с существующей базой данных SQL, а также позволяет EFCore создавать новую базу данных SQL. Проблема существует только в режиме sqlite в памяти.

public async Task UpdateCategoryWithCorrectEtag(Category expectedCategory)
{
       var connection = new SqliteConnection("DataSource=:memory:");
       connection.Open();
       var builder = new DbContextOptionsBuilder<NorthwindContext>().UseSqlite(connection);
       var context = new NorthwindContext(builder.Options);

       try
       {
           context.Database.EnsureCreated();
           var x = context.Categories.Count();
       }
       finally
       {
           context.Database.EnsureDeleted();
           connection.Close(); 
       }
}

Обновлено: Сущность «Регион» определяется следующим образом. Я также отмечаю, что это, кажется, единственная таблица, где имя сущности уже совпадает с именем таблицы.

modelBuilder.Entity<Region>(entity =>
{
    entity.ToTable("Region");
    entity.HasKey(e => e.RegionId)
        .ForSqlServerIsClustered(false);

    entity.Property(e => e.RegionId)
        .HasColumnName("RegionID")
        .ValueGeneratedNever();

    entity.Property(e => e.RegionDescription)
        .IsRequired()
        .HasMaxLength(50);
});

ОБНОВИТЬ: Я уже пытался удалить строку entity.ToTable("Region"); чтобы увидеть, не было ли это причиной создания таблицы дважды, однако это все еще имеет ту же проблему. В настоящее время я удалил все таблицы, кроме двух, которые мне абсолютно необходимы для запуска теста, и он работает. Вставляем их по одному, чтобы посмотреть, что сломается. Доложит.

modelBuilder.Entity<Region>(entity => { entity.ToTable("Region"); entity.HasKey(e => e.RegionId) .ForSqlServerIsClustered(false); entity.Property(e => e.RegionId) .HasColumnName ("RegionID") .ValueGeneratedNever(); entity.Property(e => e.RegionDescription) .IsRequired() .HasMaxLength(50); });

Toad 30.05.2019 13:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
1
1 264
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У меня есть ответ после того, как я потратил больше времени на удаление всех таблиц, а затем добавлял элементы, пока проблема не вернулась.

Проблема была вызвана тем, что индексы таблиц совпадали с индексами других таблиц или с именем таблицы. С SQL Server и EF Core в памяти это было нормально, потому что они воспринимались как индексы в таблице. Но с Sqlite не нравилось, что разные объекты имеют одно и то же имя, независимо от их видимой области видимости.

Решение состояло в том, чтобы гарантировать, что имена всех объектов уникальны, чтобы вообще ничего не конфликтовало. В этом случае имя «Регион» было именем таблицы и именем индекса в другой таблице.

Другие вопросы по теме