【问题标题】:Array of enums deserialization error, EF Core枚举数组反序列化错误,EF Core
【发布时间】:2021-04-24 05:59:14
【问题描述】:

我有几列包含 JSON 数据。这些特定的列是一个枚举数组。

查询MembershipType 表时,序列化和反序列化运行良好,符合预期。但是,我有一个嵌套 MembershipTypes 数组的 SQL 视图,这样做会导致 EF Core 引发类似于以下的错误:

System.Exception:“将值 \"[\"Certified\"]\" 转换为类型 'DataLayer.Models.Members.MembershipTypeCategory[]' 时出错。路径 '[0].History.MembershipType.Categories',行1,位置 585。”

您可以看到添加到该值的所有额外引号和反斜杠。我已经尝试用字符串替换引号和反斜杠,这很有效,但这可能会对其他字符串数据产生不良影响。

有什么想法吗?

代码如下: SQL 视图

SELECT 
    hist.*
    , (
        select * from Member.MembershipTypes 
        where id = hist.MembershipTypeId and Deleted = 0
        FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
    ) as MembershipType
...

枚举

public enum MembershipTypeCategory
{
    Type1,
    Type2,
    Type3
}

以及它所在的班级:

[Table("MembershipTypes", Schema = "Member")]
public class MembershipType : EntityBase, IMembershipTypeDto
{
    ...

    [NotMapped]
    public MembershipTypeCategory[] Categories { get; set; }
    
    ...
}

在模型构建器中我有:

var settings = new JsonSerializerSettings
{
    ContractResolver = new IgnoreVirtualResolver(),
    PreserveReferencesHandling = PreserveReferencesHandling.None,
    ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
    TypeNameHandling = TypeNameHandling.All,
    Formatting = Formatting.None,
    Error = HandleDeserializationError
};

modelBuilder.Entity<MembershipType>()
    .Property(x => x.Categories)
    .HasConversion(
        v => JsonConvert.SerializeObject(v, Formatting.None, settings),
        v => JsonConvert.DeserializeObject<MembershipTypeCategory[]>(v, settings)
    );

return modelBuilder;

【问题讨论】:

    标签: c# .net sql-server entity-framework


    【解决方案1】:

    我认为你的转换器不行。我生成像你这样的代码(首先在 EF 代码中)并且读/写数据没问题,但是存储在 db 中的字符串是:

    {"$type":"XXX.Model.Tests.TestType[], XXX.Model","$values":[1,2]}
    

    你必须重新考虑转换器;)

    示例解决方案:

            public static string ToJson(Enum[] values)
            {
                return ((values?.Length ?? 0) == 0) ?  return "[]" : $"['{string.Join("','", values)}']";
            }
    
            public static Enum[] FromJson(string json)
            {
                return JsonConvert.DeserializeObject<Enum[]>(json);
            }
    
    

    或者使用JavaScriptSerializer - JSON serialization of enum as string中的方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-31
      • 2015-07-26
      • 1970-01-01
      • 2021-11-30
      相关资源
      最近更新 更多