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

如何配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 02:48:22