You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级EF Core 6.0后Owned实体RefreshToken触发InvalidOperationException如何解决?

问题根因

EF Core 6.0 加强了Owned实体类型的校验逻辑,你的代码存在两处不符合6.0校验规则的配置,触发了异常:

  • RefreshToken类中定义了指向所有者User的反向导航属性,EF扫描时会误判RefreshToken为独立实体,而非从属的Owned类型
  • RefreshToken同时通过[Owned]特性和Fluent API的OwnsMany重复配置Owned属性,多余的特性标注干扰了EF的实体类型判定

解决方案

1. 修正RefreshToken实体定义

删除多余的特性和反向导航属性,修改后代码如下:

public class RefreshToken
{
    public int Id { get; set; }
    public string Token { get; set; }
}

2. 优化Fluent API配置

调整为强类型写法,避免字符串拼写错误引发的配置失效:

modelBuilder.Entity<User>(b =>
{
    b.OwnsMany<RefreshToken>(u => u.RefreshTokens, b1 =>
    {
        b1.Property<int>("Id")
            .ValueGeneratedOnAdd()
            .HasColumnType("integer")
            .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);

        b1.Property<string>("Token")
            .HasColumnType("text");

        b1.Property<string>("UserId")
            .IsRequired()
            .HasColumnType("text");

        b1.HasKey("Id");
        b1.HasIndex("UserId");
        b1.ToTable("RefreshTokens");
        b1.WithOwner().HasForeignKey("UserId");
    });
    b.Navigation(u => u.RefreshTokens);
});

3. 重置迁移配置

删除项目中旧的迁移文件和ModelSnapshot文件,重新执行以下命令生成新的迁移:

Add-Migration FixRefreshTokenOwnedConfig
Update-Database

内容的提问来源于stack exchange,提问作者user3757605

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 00:15:05