微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

迁移到 .NET 5 时,带有鉴别器的表中来自 LINQ 的不同查询

如何解决迁移到 .NET 5 时,带有鉴别器的表中来自 LINQ 的不同查询

我将我们的解决方案从 .NET Core 3.1 迁移到 .NET 5。现在我面临这个问题: 我有一个 Link 模型,它具有带有两种类型值的鉴别器列,现在该表的 LINQ 不起作用,当我将其转换为 sql 查询并与以前的版本进行比较时,这是两个不同的查询,而 .NET 5 给出了我在 Postgresql 中运行时出错。

var test = _identityContext.Links.AsQueryable();

这是我在两个不同版本中得到的两个不同查询

在 .Net Core 3.1 中:

SELECT l."Id",l."discriminator",l."Inserted",l."UserId",l.xmin
FROM "Links" AS l
WHERE l."discriminator" IN ('GamecenterLinkModel','GooglePlayLinkModel')

在 .Net 5 中:

SELECT l."Id",l.xmin,CASE
    WHEN (g0."Id" IS NOT NULL) THEN 'GooglePlayLinkModel'
    WHEN (g."Id" IS NOT NULL) THEN 'GamecenterLinkModel'
END AS "discriminator"
FROM "Links" AS l
LEFT JOIN "GamecenterLinks" AS g ON l."Id" = g."Id"
LEFT JOIN "GooglePlayLinks" AS g0 ON l."Id" = g0."Id"

在 .NET 5 中定义鉴别器有什么变化吗?

这是我的链接模型:

 [Table("Links")]
 public abstract class LinkModel : ILinkModel,ITimeStampInserted
    {
        public string Id { get; set; }

        public usermodel User { get; set; }

        public DateTime Inserted { get; set; }

        public abstract ILink ToLink();
    }

 [Table("GamecenterLinks")]
    public class GamecenterLinkModel : LinkModel
    {
        public override ILink ToLink()
        {
            return new GameCenterLink(Id);
        }
    }

 [Table("GooglePlayLinks")]
    public class GooglePlayLinkModel : LinkModel
    {
        public override ILink ToLink()
        {
            return new GooglePlayLink(Id);
        }
    }

我的 IdentityContext 类:

  public class IdentityContext : DbContextBase
  {
    public DbSet<usermodel> Users { get; set; }

    public DbSet<RefreshTokenModel> RefreshTokenLinks { get; set; }

    public DbSet<GamecenterLinkModel> GamecenterLinks { get; set; }

    public DbSet<GooglePlayLinkModel> GooglePlayLinks { get; set; }

    public DbSet<LinkConflictModel> LinkConflicts { get; set; }

    public DbSet<LinkModel> Links { get; set; }
  
    public IdentityContext(DbContextOptions<IdentityContext> options) : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<usermodel>().UseXminAsConcurrencyToken();
        modelBuilder.Entity<RefreshTokenModel>().UseXminAsConcurrencyToken();
        modelBuilder.Entity<GamecenterLinkModel>().UseXminAsConcurrencyToken();
        modelBuilder.Entity<LinkModel>().UseXminAsConcurrencyToken();
    }
}

更新: 我将 EF 版本、Npgsql 和 Npgsql.EntityFrameworkCore.Postgresql 降级到 3.1.3,现在一切正常,所以猜测是 EF 升级问题。

更新 2: 我从两个派生类的顶部删除[Table("GamecenterLinks")][Table("GooglePlayLinks")] 注释,它解决了这个问题,想想当我更新 EF Core 时,它​​混淆了它与 Table-Per-type 并假设它们是每个派生类的两个不同表。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。