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