.net - 使用 EF core 更新 JSON 属性的最佳方法

标签 .net sql-server entity-framework .net-core entity-framework-core

我考虑将一些信息作为 JSON 对象存储在 SQL Server 数据库中,但我不清楚如何更新 JSON 列中该对象的单个属性,而不是整个对象。

它是一个asp.net核心应用程序。作为 ORM,我使用 Entity Framework 核心。我想创建一个类似于此示例的类:

public class Person{
  public int Id {get;set;}
  public string FirstName {get;set;}
  public string  LastName {get;set;}  
  public string AdditionData {get;set;} //json object
}

“AdditionData”列中的 JSON 对象将具有以下格式:

{
  phoneNumbers:["123456789","789456123"],
  groups:[{name:"g1", description:"blah"}, {name:"g2", description:"blah2"}]
}

所以现在我想向某人添加新的电话号码,方法签名可能如下所示:

void AddPhoneNumber(int personId, string phoneNumber);

我发现只有两个选项可以将新的电话号码添加到所描述的对象中。

第一个选项:

  1. 使用 EF 按 ID 查找人员
  2. 从字符串反序列化整个 AdditionData 对象
  3. 将新电话号码添加到additionData.PhoneNumbers列表
  4. 将 AdditionData 对象序列化回字符串
  5. 使用此字符串更新 person.AdditionData 属性
  6. 执行“saveChanges”

第二个选项:

使用JSON_MODIFY SQL函数并使用参数执行原始SQL,如下所示:

context.Database.ExecuteSqlCommand("UPDATE Person
SET additionalData = JSON_MODIFY(additionalData,"append  $.phoneNumbers", @phoneNumber)
WHERE Id= @personId", personIdParam,phoneNumberParam);

问题: 还有其他方法可以做到这一点吗?因为我所描述的这两种方式对我来说看起来并不优雅(尤其是第一种)。

最佳答案

从 EF Core 2.2 开始这是不可能的。有一个proposal对于这样的功能,但我不会屏住呼吸。

如果您存储的 JSON 很小和/或更新很少,我会使用第一种方法,因为更改存储在上下文中,并且您不需要事务并且与 EF 的整体设计更好地保持一致。另外,它为您提供编译时安全性并且更容易重构/更改。查看此线程 - How to store JSON in an entity field with EF Core?

如果您需要性能,那么绝对需要 JSON_MODIFY sql 命令。

关于.net - 使用 EF core 更新 JSON 属性的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54239681/

相关文章:

c# - 使用 anchor 自动缩放大小 - 重叠控件

c++ - 进程间并发文件写入

entity-framework - Entity Framework 4.1默认急切加载

c# - EF调用存储过程出现 "must declare the scalar variable @var"错误如何解决?

mysql - .Net 连接池 MySQL 临时表

c# - 批量插入未保存到数据库

从 Tomcat 到 SQL Server 2014 的 Java 7 SSL 连接

sql - 与 self 关系的表

mysql - 将 Entity Framework 查询转换为 SQL

c# - 异步任务和锁