使用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个表之外,它都可以运行。将它们一个个放回去看看有什么坏处。将会回报。
答案 0 :(得分:1)
花更多时间删除所有表然后添加项目直到问题再次出现,我才有了答案。
此问题是由表上的索引与其他表上的索引相同或表名引起的。对于SQL Server和EF Core内存,这是可以的,因为它将它们视为表上的索引。但是,使用Sqlite时,无论其外观范围如何,都对具有相同名称的不同对象感到不满意。
解决方案是确保所有对象的名称都是唯一的,因此不会发生任何冲突。在这种情况下,名称“ Region”是表的名称,而另一个表上的索引的名称。