如何配置CreatedBy字段:序列化允许为空,数据库非空?
问题描述
我在类中将CreatedBy字段标记为[Required],目的是让Entity Framework在迁移时将该字段设为数据库非空:
public class MyClass { [Required] public string? CreatedBy {get;set;} }
但CreatedBy字段是在服务器创建实体时才设置值,客户端首次提交数据时该字段必须为NULL。现在我遇到了模型验证错误:
400 Bad Request - ['The CreatedBy field is required.']
请问如何配置才能让CreatedBy字段在客户端提交时允许为空,但在数据库中保持非空?
解决方案
问题出在[Required]特性会同时被Entity Framework Core(控制数据库结构)和ASP.NET Core模型验证(检查客户端提交数据)识别,因此需要分开配置这两个规则。
方法一:使用Fluent API配置数据库非空(推荐)
移除属性上的[Required]特性,转而在DbContext的OnModelCreating方法中通过Fluent API单独指定数据库字段非空。这样模型验证不会将该字段视为必填项,客户端可以传入null:
实体类定义
public class MyClass { public string? CreatedBy { get; set; } }
DbContext配置
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<MyClass>() .Property(entity => entity.CreatedBy) .IsRequired(); // 仅告知EF Core该字段在数据库中不可为空 }
方法二:使用数据注解分离规则
如果偏好使用特性配置,可以用EF Core专属的[Column]特性标记数据库非空,同时用[ValidateNever]跳过模型验证:
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; public class MyClass { // 指定数据库字段非空 [Column(Nullable = false)] // 跳过模型验证,允许客户端传入null [ValidateNever] public string? CreatedBy { get; set; } }
补充说明
如果使用Newtonsoft.Json作为序列化工具,还可以通过[JsonProperty(Required = Required.Default)]明确告诉序列化器该字段不是必填项,配合EF的非空配置使用:
using Newtonsoft.Json; using System.ComponentModel.DataAnnotations; public class MyClass { [Required] // 告知EF Core数据库非空 [JsonProperty(Required = Required.Default)] // 告知序列化器允许空值 public string? CreatedBy { get; set; } }
内容的提问来源于stack exchange,提问作者The One
相关产品推荐
相关产品推荐

