如何解决迁移到 .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 举报,一经查实,本站将立刻删除。