0

将Microsoft.AspNetCore.Identity.EntityFrameworkCoreMicrosoft.EntityFrameworkCore.ToolsNpgsql.EntityFrameworkCore.PostgreSQL块升级到版本6.0.0后,我的 .NET 6.0 Web API 开始抛出此异常:

实体类型“RefreshToken”已被标记为拥有,必须通过导航从另一个实体类型引用。将导航添加到指向“RefreshToken”或不将其配置为拥有的实体类型。

每当执行任何涉及数据库的操作时,似乎都会引发异常。如果我正确理解错误,它不会在 RefreshToken 实体配置中找到导航,但是我自动生成的 ModelSnapshot 似乎确实包含它。

RefreshToken.cs(为简化起见,删除了一些属性)

[Owned]
public class RefreshToken
{
    [Key]
    public int Id { get; set; }
    public string Token { get; set; }
    public virtual User User { get; set; }
}

用户.cs

public class User : IdentityUser
{
    public List<RefreshToken> RefreshTokens { get; set; }
}

摘自 BuildModel(ModelBuilder modelBuilder)

modelBuilder.Entity("API.Models.User", b =>
    {
        b.OwnsMany("API.Models.RefreshToken", "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("RefreshTokens");
    });

我查看了 EF Core 6.0 重大更改(https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-6.0/break-changes#owned-index)但是找不到会导致此问题的原因。

4

1 回答 1

0

我在链接到的那个 github 线程上收到了回复,其中包含对我有用的修复程序。在我的情况下,我不使用属性,因此您可能必须切换到流利的 API。

该线程还引用了 7.0.0 里程碑,因此如果您来自未来,可能值得一试。


modelBuilder.Entity<DerivedDerivedClass>().OwnsOne(d => d.OwnedType);

modelBuilder.Entity<DerivedClass>().OwnsOne(d => d.OwnedType);

作为一种解决方法,请避免调用 modelBuilder.Entity().OwnsOne(d => d.OwnedType);


据我了解,您只想在派生类上配置一次,而不是在DerivedDerivedClass.

于 2022-02-12T14:34:24.190 回答