Создание модульных тестов с помощью 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"); чтобы увидеть, не было ли это причиной создания таблицы дважды, однако это все еще имеет ту же проблему. В настоящее время я удалил все таблицы, кроме двух, которые мне абсолютно необходимы для запуска теста, и он работает. Вставляем их по одному, чтобы посмотреть, что сломается. Доложит.
У меня есть ответ после того, как я потратил больше времени на удаление всех таблиц, а затем добавлял элементы, пока проблема не вернулась.
Проблема была вызвана тем, что индексы таблиц совпадали с индексами других таблиц или с именем таблицы. С SQL Server и EF Core в памяти это было нормально, потому что они воспринимались как индексы в таблице. Но с Sqlite не нравилось, что разные объекты имеют одно и то же имя, независимо от их видимой области видимости.
Решение состояло в том, чтобы гарантировать, что имена всех объектов уникальны, чтобы вообще ничего не конфликтовало. В этом случае имя «Регион» было именем таблицы и именем индекса в другой таблице.
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); });