用EF核心更新JSON属性的最佳方法

时间:2019-01-17 15:57:32

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

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

这是一个asp.net核心应用程序。作为ORM,我使用实体框架核心。我想创建一个类似于以下示例的类:

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"}]
}

所以现在我想向某人添加新的PhoneNumber,方法签名可能看起来像这样:

void AddPhoneNumber(int personId, string phoneNumber);

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

第一个:  1)使用EF通过ID查找人  2)从字符串反序列化整个AdditionData对象  3)将新的phoneNumber添加到additionalData.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);

问题:  是否存在另一种方法?因为我所描述的这两种方式看起来并不那么优雅(尤其是第一个)。

1 个答案:

答案 0 :(得分:2)

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

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

如果您需要的性能绝对不是JSON_MODIFY sql命令。