gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:46:23 25 4
gpt4 key购买 nike

使用 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();
}
}

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

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 个表之外的所有表,我绝对需要运行测试并且它有效。将它们一一放回去,看看哪里坏了。会回来报告。

最佳答案

在花费更多时间删除所有表格然后添加项目直到问题返回后,我得到了答案。

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

解决方案是确保所有对象的名称都是唯一的,这样就不会发生任何冲突。在本例中,名称“Region”是一个表的名称和另一个表上的索引的名称。

关于c# - context.EnsureCreated() 抛出异常 - 已经有一个名为的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56375048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com