问题描述
我将我们的解决方案从 .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 (将#修改为@)