如何通过DataAnnotations或非SQL调整EF实体的JSON输出格式
解决方案
可以通过修改实体类配置+DataAnnotations实现目标格式,无需操作SQL,结合重建迁移即可完成,具体步骤如下:
1. 修正activityId的类型与生成规则
目标格式中activityId为数字类型,但当前实体使用Guid,需修改属性类型并配置自增规则:
- 将
Guid类型改为int - 添加
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]特性,让EF自动生成自增数字主键
2. 配置日期输出格式
目标日期格式为yyyy-MM-dd HH:mm:ss,可通过DataAnnotations指定JSON序列化规则,分两种常用JSON库处理:
若使用System.Text.Json(.NET Core 3.0+默认)
先自定义日期转换器:
public class CustomDateTimeConverter : JsonConverter<DateTime> { private const string TargetFormat = "yyyy-MM-dd HH:mm:ss"; public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { return DateTime.ParseExact(reader.GetString()!, TargetFormat, CultureInfo.InvariantCulture); } public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options) { writer.WriteStringValue(value.ToString(TargetFormat, CultureInfo.InvariantCulture)); } }
再在实体日期属性上添加[JsonConverter(typeof(CustomDateTimeConverter))]特性。
若使用Newtonsoft.Json(Json.NET)
直接在日期属性上添加特性指定格式:
[JsonConverter(typeof(IsoDateTimeConverter), "yyyy-MM-dd HH:mm:ss")]
修改后的实体类示例(System.Text.Json版本)
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Text.Json.Serialization; using System.Globalization; public class Activity { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int activityId { get; set; } [DataType(DataType.DateTime)] [JsonConverter(typeof(CustomDateTimeConverter))] public DateTime startDate { get; set; } [DataType(DataType.DateTime)] [JsonConverter(typeof(CustomDateTimeConverter))] public DateTime endDate { get; set; } } // 自定义日期转换器 public class CustomDateTimeConverter : JsonConverter<DateTime> { private const string TargetFormat = "yyyy-MM-dd HH:mm:ss"; public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { return DateTime.ParseExact(reader.GetString()!, TargetFormat, CultureInfo.InvariantCulture); } public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options) { writer.WriteStringValue(value.ToString(TargetFormat, CultureInfo.InvariantCulture)); } }
迁移重建步骤
- 删除项目中
Migrations文件夹下的所有迁移文件 - 删除本地开发数据库(直接删除对应文件或在数据库管理工具中删除)
- 执行初始迁移生成命令:
- Package Manager Console:
Add-Migration InitialCreate - .NET CLI:
dotnet ef migrations add InitialCreate
- Package Manager Console:
- 更新数据库:
- Package Manager Console:
Update-Database - .NET CLI:
dotnet ef database update
- Package Manager Console:
完成后,数据库中activityId会是自增整数,JSON输出将完全符合目标格式。
内容的提问来源于stack exchange,提问作者KaedeZeelich
相关产品推荐
相关产品推荐

