context.EnsureCreated () выбрасывает исключение - уже таблица с именем - PullRequest
1 голос
/ 30 мая 2019

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

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

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

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

Я уже проверил context.OnModelCreating и таблица 'Region' определяется только один раз.

Обратите внимание, что это работаетотлично работает на существующей базе данных 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(); 
       }
}

РЕДАКТИРОВАТЬ: сущность '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);
});

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

1 Ответ

1 голос
/ 30 мая 2019

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...