无论是否使用EnsureCreated(),使用Sqlite InMemory创建单元测试都会给出异常。我在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();
}
}
编辑:定义如下的'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");以查看这是否导致表被创建两次,但是,仍然存在相同的问题。目前,我已经删除了所有的表,除了2个我绝对需要运行测试的表,并且运行正常。把它们一个接一个地放回去看看是什么坏了。就会回来报到。
发布于 2019-05-30 23:32:41
我花了更多的时间删除所有的表,然后添加项目,直到问题再次出现,我才得到了答案。
该问题是由表上的索引与其他表上的索引相同或作为表名引起的。对于SQL Server和EF Core在内存中,这是可以的,因为它将它们视为表上的索引。但是,对于Sqlite,它不喜欢不同的对象具有相同的名称,而不管它们的明显作用域。
解决方案是确保所有对象的名称都是唯一的,这样就不会有任何冲突。在本例中,名称“Region”是一个表的名称,也是另一个表上的索引的名称。
https://stackoverflow.com/questions/56375048
复制相似问题