postgresql C#/EF列的类型为uuid,但表达式的类型为text

jxct1oxe  于 2023-02-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(249)

我正在把我的.Net从核心3. 2更新到7. 0,我的单元测试快疯了。
我现在收到以下错误

Microsoft.EntityFrameworkCore.DbUpdateException : An error occurred while saving the entity changes. See the inner exception for details.
Npgsql.PostgresException : 42804: column "DefaultResourceId" is of type uuid but expression is of type text

我通过这个追踪到的
类别

public class ApplicationUser : IdentityUser<Guid>
{
    public string DefaultResourceId { get; set; }
}

快照

b.Property<string>("DefaultResourceId")
    .HasColumnType("text");

波斯特格雷

DefaultResourceId | Text | Default | Not Null []

导致错误的代码

public TContext DbContext => Factory.Server.Host.Services.GetRequiredService<TContext>();
var user = new ApplicationUser
            {
                Id = Guid.NewGuid()
            };

await DbContext.AddAsync(user);
await DbContext.SaveChangesAsync();

代码在其他方面工作顺利,所以我不知道从哪里开始。有什么想法吗?

  • 我做了测试
  • 除测试中出现此错误外,所有内容均按预期运行(未使用此ApplicationUser的其他测试运行正常)。
  • 不确定这个“uuid”的东西是从哪里来的,也不知道它可能在哪里。
  • 注意:这是一个Guid,但在一年前已更改,并且在迁移到7.0后不再是问题
but5z9lq

but5z9lq1#

UUID是GUID的另一个术语。(通用唯一ID与全局唯一ID)
例外情况是,当EF被配置为期望字符串时,您的测试所访问的数据库仍然将该列作为GUID/UUID。
这意味着无论您的测试与哪个数据库通信,其列类型仍然是PostreSQL UUID类型,而不是Varchar/Text列。通常,当您有多个数据库并更新了一个数据库,但测试使用的连接字符串指向未更新的旧模式时,会出现此问题。(当运行模式优先而不是代码优先时)或者有一个问题,即没有对测试数据库运行迁移。
检查您认为运行测试所针对的连接字符串,或在测试中使用断点来检查DbContext.Database.ConnectionString,以验证它是否确实指向您认为它所指向的位置。

相关问题