context.EnsureCreated() 抛出异常 - 已经是一个名为的表

Toa*_*oad 4 c# sqlite entity-framework-core

使用 Sqlite InMemory 创建单元测试在使用和不使用 EnsureCreated() 时都会给出异常。我正在 MS Northwind 数据库上进行测试。

如果我调用 ensureCreated() 会引发异常“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(); 
       }
}
Run Code Online (Sandbox Code Playgroud)

编辑:“区域”实体定义如下。我还注意到,这似乎是实体名称已与表名称匹配的唯一表。

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);
});
Run Code Online (Sandbox Code Playgroud)

更新:我已经尝试删除行 entity.ToTable("Region"); 看看这是否导致表被创建两次,但是,这仍然有同样的问题。目前,除了我绝对需要运行测试的 2 个表之外,我已经删除了所有表,并且它可以工作。将它们一一放回原处,看看有什么坏处。会回来汇报的。

Toa*_*oad 5

在花了更多时间删除所有表格然后添加项目直到问题再次出现后,我有了答案。

该问题是由表上的索引与其他表上的索引或表名相同引起的。使用内存中的 SQL Server 和 EF Core,这没问题,因为它将它们视为表中的索引。但是,对于 Sqlite,它对具有相同名称的不同对象并不满意,无论它们的明显范围如何。

解决方案是确保所有对象的名称都是唯一的,因此根本不会发生冲突。在这种情况下,名称“区域”是表的名称和不同表上的索引的名称。