context.EnsureCreated()引发异常-已经是一个名为

时间:2019-05-30 09:06:09

标签: c# sqlite entity-framework-core

使用Sqlite InMemory创建单元测试会在带有和不带有SecureCreated()的情况下给出异常。我正在测试MS Northwind数据库。

如果我调用sureCreated()会引发异常“ Microsoft.Data.Sqlite.SqliteException:SQLite错误1:'已经有一个名为Region的表'。”

我的理解是,只有在尚未创建数据库的情况下,EnsureCreated()才会尝试创建该数据库。

因此,它似乎已经创建了数据库,因此我尝试删除该调用,此调用后来由于表不存在而导致异常。因此,我出现了带有SecureCreated()的异常,没有它,没有表。

我已经检查了上下文。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(); 
       }
}

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

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”);看看是否导致表被创建两次,但是,这仍然有相同的问题。 目前,我已经删除了所有的表,除了我绝对需要运行的2个表之外,它都可以运行。将它们一个个放回去看看有什么坏处。将会回报。

1 个答案:

答案 0 :(得分:1)

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

此问题是由表上的索引与其他表上的索引相同或表名引起的。对于SQL Server和EF Core内存,这是可以的,因为它将它们视为表上的索引。但是,使用Sqlite时,无论其外观范围如何,都对具有相同名称的不同对象感到不满意。

解决方案是确保所有对象的名称都是唯一的,因此不会发生任何冲突。在这种情况下,名称“ Region”是表的名称,而另一个表上的索引的名称。