You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过EF Core将Web端无短横线GUID存入SQL Server

解决方案:保留无短横线GUID格式存入SQL Server

针对你遇到的JSON中无短横线GUID解析后自动添加短横线、存入数据库格式变更的问题,分两种场景给出具体处理方式:

场景1:直接存储无短横线的32位字符串

如果不需要用SQL Server的uniqueidentifier类型存储,直接保留原始字符串格式:

  • 数据库调整:将对应字段类型改为char(32)或varchar(32)(char(32)更适合固定长度的GUID字符串)。
  • 代码调整:在接收JSON的模型类中,将id字段定义为string类型,而非Guid类型。这样反序列化时会直接保留原始无短横线的字符串,存入数据库时也不会有格式转换。

示例模型:

public class CostCenter
{
    public string Id { get; set; }
    public Company Company { get; set; }
    public string Name { get; set; }
    public string Code { get; set; }
    public DateTime CreationDate { get; set; }
    public int AccountingBranch { get; set; }
    public string _discriminator { get; set; }
}

public class Company
{
    public string Id { get; set; }
    public int Code { get; set; }
    public string Companyname { get; set; }
    public string _discriminator { get; set; }
}

场景2:使用SQL Server的uniqueidentifier类型存储

如果必须用uniqueidentifier类型(二进制存储,更节省空间),注意该类型实际存储的是16字节二进制数据,显示时的短横线只是格式化后的表现。要实现解析无短横线字符串、读取时返回无短横线格式的需求,可通过自定义JSON转换器处理:

用System.Text.Json实现自定义转换器

public class GuidNoHyphenConverter : JsonConverter<Guid>
{
    // 读取无短横线字符串并转换为Guid
    public override Guid Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        var guidStr = reader.GetString()!;
        return Guid.Parse(guidStr); // Guid.Parse原生支持解析无短横线的GUID字符串
    }

    // 写入时输出无短横线格式
    public override void Write(Utf8JsonWriter writer, Guid value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToString("N"));
    }
}

在模型中应用转换器:

public class CostCenter
{
    [JsonConverter(typeof(GuidNoHyphenConverter))]
    public Guid Id { get; set; }

    public Company Company { get; set; }
    // 其他属性...
}

public class Company
{
    [JsonConverter(typeof(GuidNoHyphenConverter))]
    public Guid Id { get; set; }
    // 其他属性...
}

用Newtonsoft.Json实现自定义转换器

public class GuidNoHyphenConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(Guid) || objectType == typeof(Guid?);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var guidStr = reader.Value as string;
        return Guid.Parse(guidStr);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var guid = (Guid)value;
        writer.WriteValue(guid.ToString("N"));
    }
}

在模型中添加特性:

public class CostCenter
{
    [JsonConverter(typeof(GuidNoHyphenConverter))]
    public Guid Id { get; set; }
    // 其他属性...
}

内容的提问来源于stack exchange,提问作者Gabriel Ribeiro Rossi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 03:25:31