如何通过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
相关产品推荐
相关产品推荐

