在 Entity Framework Core 中为 PostgreSQL 表的计算列设置公式

Posted

技术标签:

【中文标题】在 Entity Framework Core 中为 PostgreSQL 表的计算列设置公式【英文标题】:Set formula for Computed column of PostgreSQL table in Entity Framework Core 【发布时间】:2021-12-02 18:08:16 【问题描述】:

我有一个简单的模型,它带有 Id 和一个 json 属性和一个计算列,它是 json 列中 'tile' 键的值

public class Book 

    public int Id  get; set; 

    [Column(TypeName="jsonb")]
    public string JsonInfo  get; set; 

    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public string Title  get; set; 

在配置中我设置了Title的值的计算方式:

    builder.Property(t => t.Title).HasComputedColumnSql("(\"JsonInfo\"->>''title'')", stored:true).HasColumnType("varchar(150)");

迁移构建没有问题,但不幸的是数据库更新以错误结束:

42601: syntax error at or near "title"

问题在于"(\"JsonInfo\"->>''title'')"title 是如何被转义的。我该如何解决?

顺便提一下,我使用的是最新版本的 PostgreSQL

【问题讨论】:

【参考方案1】:

你不应该用两次单引号来转义标题;您提供给 HasComputedColumnSql 的 SQL 不是文本文字,而是实际的 SQL。所以以下应该工作:

.HasComputedColumnSql("\"JsonInfo\"->>'title'", stored: true)

【讨论】:

感谢@Shay-rojansky,但我实际上通过指定列类型解决了问题:("\"JsonInfo\"::jsonb->>'title'::text") 你不应该需要那个 - 尝试删除 ::jsonb 部分。可能解决问题的方法是,title 周围不再有两个单引号。

以上是关于在 Entity Framework Core 中为 PostgreSQL 表的计算列设置公式的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Entity Framework Core 中运行存储过程?

如何在 Entity Framework Core 中运行存储过程?

什么是自有实体?何时以及为什么在 Entity Framework Core 中使用 Owned Entity?

Entity Framework Core 中 TimeSpan 的总和

Entity Framework优化一:引发了“System.Data.Entity.Core.EntityCommandExecutionException”类型的异常

如何在 Entity Framework Core 2 中播种?