【问题标题】:Store Jsonstring using Entity Framework Core ExecuteSqlRawAsync使用 Entity Framework Core ExecuteSqlRawAsync 存储 Jsonstring
【发布时间】:2021-01-09 11:53:03
【问题描述】:

我有一个实体,其中一个字符串字段我想使用 EF Core ExecuteSqlRawAsync 扩展存储 jsonstring(相当于 MyObject 列表的 json)。

但是,我收到了这个错误:

输入字符串的格式不正确。

来自英孚

Microsoft.EntityFrameworkCore.Storage.Internal.RawSqlCommandBuilder.Build.

我使用的是 EF Core 3.1 版。

请在下面找到类似于我正在尝试的示例概述:

string query = "update mytable set column1 = 100, column2= '[{\"property1\":\"value1\",\"property2\":null}]' where condition;update mytable set column1= 200, column2= '[{\"property1\":\"value2\",\"property\":null}]' where condition;"

await this.Context.Database.ExecuteSqlRawAsync(query);

如果我直接对 SQL Server 数据库运行相同的原始 SQL 语句,它就可以正常工作。

RawSql 扩展是否存在实体中的字符串字段不能有 jsonstring 的限制?

任何帮助如何使用包含 jsonstring 的字符串实体字段之一运行原始查询?

【问题讨论】:

    标签: c# .net-core entity-framework-core


    【解决方案1】:

    问题是由 SQL 字符串中的'{''}' 符号引起的,因为在ExecuteSqlRaw{Async} 中它们用于指定参数占位符,因此该字符串应该是string.Format 函数的有效输入。事实上,EF Core 实现在某些时候使用string.Format(即使您不传递参数),这反过来又会产生有问题的异常。如果你这样做可以看到

    string.Format(query);
    

    解决方案是通过在内部加倍'{''}' 符号使其成为有效格式字符串。例如,在您的示例中:

    string query = "update mytable set column1 = 100, column2= '[{{\"property1\":\"value1\",\"property2\":null}}]' where condition;update mytable set column1= 200, column2= '[{{\"property1\":\"value2\",\"property\":null}}]' where condition;"
    

    如果您尝试实际参数化您的 SQL,那会很好。

    【讨论】:

    • 确实是问题所在。就我而言,单个查询语句可能包含许多具有相同参数集但值不同的实体(类似于问题示例)。我不确定是否有一种干净的方法可以在这种情况下在原始查询中传递参数。这里的问题陈述是将一组参数映射到同一查询的每个语句部分的参数占位符。有什么建议吗?
    • 不同的值表示不同的参数。只需将嵌入的文字替换为占位符“指向*的值,就像使用 string.Format 一样。例如 var ags = new List<object> { 100, 200 }; 然后 var query = "... column1 = {0}, ... column1 = {1} ..."; 最后是 ExecuteSqlRawAsync(query, args)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    相关资源
    最近更新 更多