我正在考虑将某些信息作为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);
问题: 是否存在另一种方法?因为我所描述的这两种方式看起来并不那么优雅(尤其是第一个)。
答案 0 :(得分:2)
从EF Core 2.2开始是不可能的。有一个proposal用于此功能,但我不会屏住呼吸。
如果您存储的JSON很小和/或更新很少,那么我会采用第一种方法,因为更改存储在上下文中,您不需要事务处理,并且可以更好地与EF的整体设计保持一致。另外,它为您提供了编译时的安全性,并且更易于重构/更改。检出该线程-How to store JSON in an entity field with EF Core?
如果您需要的性能绝对不是JSON_MODIFY sql命令。