EFCore HasDefaultValueSql (续1 ValueGeneratedOnAdd)

ops/2025/1/14 20:49:21/

前情:EFCore HasDefaultValueSql

小伙伴在使用 HasDefaultValueSql 时,对相关的 ValueGeneratedOnAdd 也有了疑问:

ValueGeneratedOnAddHasDefaultValueSqlEntity Framework Core 中用于管理字段默认值的两种不同配置方式,它们的作用和使用场景不同:


1. ValueGeneratedOnAdd 的作用

ValueGeneratedOnAdd 是一种 值生成策略,表示该字段的值将在数据库插入新记录时自动生成(由数据库负责)。

核心特点
  • 自动生成值:EF Core 会明确标记此字段的值应由数据库生成。
  • 适用场景
    • 数据库自动生成的默认值(如默认数值、当前时间戳等)。
    • 数据库的计算列(Computed)。
    • 使用主键自增的列(如 IDENTITYSEQUENCE)。
行为
  • 如果字段未显式赋值,ValueGeneratedOnAdd省略该字段,让数据库自动生成其值。
  • 即使字段显式赋值,EF Core 也会将其标记为“由数据库生成”,导致插入操作可能报错或忽略应用程序的赋值
示例代码

模型定义:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ modelBuilder.Entity<Example>() .Property(e => e.Age) .ValueGeneratedOnAdd(); 
} 

插入代码:

var example = new Example 
{ Name = "Alice" // Age 未赋值 
}; 
context.Examples.Add(example); 
context.SaveChanges(); 

生成的 SQL:

INSERT INTO Example (Name) VALUES ('Alice'); -- Age 列未包含 

最终数据库会使用 DEFAULT 值或其他自动生成逻辑。


2. HasDefaultValueSql 的作用

HasDefaultValueSql 用于为数据库字段配置一个 默认值,该默认值由数据库在未显式指定值时自动填充。

核心特点
  • 设置字段的默认值:用于在迁移中生成 SQL,如 DEFAULT 或其他基于 SQL 的默认值。
  • 适用场景
    • 为字段配置一个静态或动态的默认值。
    • 只在 未显式赋值时 使用该默认值。
行为
  • 如果字段未显式赋值,EF Core 省略该字段,依赖数据库的 DEFAULT 值。
  • 如果字段显式赋值,EF Core 会将显式赋值的值写入 INSERT 语句,覆盖数据库的默认值。
示例代码

模型定义:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ modelBuilder.Entity<Example>() .Property(e => e.Age) .HasDefaultValueSql("18"); 
} 

插入代码:

var example = new Example 
{ Name = "Bob", Age = 25 // 显式赋值 
}; 
context.Examples.Add(example); 
context.SaveChanges(); 

生成的 SQL:

INSERT INTO Example (Name, Age) VALUES ('Bob', 25); -- 显式指定值 

区别对比

特性ValueGeneratedOnAddHasDefaultValueSql
作用标记值由数据库自动生成。配置字段的默认值(用于迁移和数据库)。
插入时行为总是省略未显式赋值的字段,依赖数据库生成值。如果字段未赋值,则省略字段,使用默认值。
显式赋值时行为即使显式赋值,可能仍被忽略或导致插入冲突。显式赋值时,生成的 SQL 使用显式值。
适用场景自增主键、数据库计算列等需要数据库生成值的字段。静态或动态的默认值,或需要数据库处理时的值。
迁移生成行为不设置默认值。生成 DEFAULT 或自定义 SQL 语句。

如何选择?

  • 如果字段的值 完全交由数据库生成(如自增、计算列等),使用 ValueGeneratedOnAdd
  • 如果字段有一个 静态或动态的默认值,并且你希望 EF Core 配置该默认值(如 DEFAULT 定义),使用 HasDefaultValueSql
  • 如果你需要两者结合(如自增且有默认值),可以同时使用,但需注意逻辑是否冲突。




http://www.ppmy.cn/ops/150103.html

相关文章

项目实战--网页五子棋(登录注册界面)(2)

上期我们实现了用户模块的后端代码&#xff0c;这期我们来实现登录界面的前端代码&#xff0c;这里主要讲解前后端交互的代码。这里我事先已经写好了一个简单的登录界面. 1. 登录页面 1. 页面实现 login.html: <!DOCTYPE html> <html lang"ch"> <…

策略模式详解与应用

策略模式&#xff08;Strategy Pattern&#xff09;&#xff0c;是一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以互相替换&#xff0c;而应用程序可以在运行时选择使用哪一个算法。策略模式使得算法的变化独立于使…

【OpenCV】第二章 图像处理基础

2.1 图像的读取与显示 图像的读取与显示是进行任何图像处理工作的第一步。在Python中&#xff0c;使用OpenCV库可以轻松实现这一功能。OpenCV&#xff08;Open Source Computer Vision Library&#xff09;提供了丰富的接口和函数&#xff0c;使得图像的操作变得直观和高效。本…

《探索 PC 端的开源神经网络多模态模型宝藏》

《探索 PC 端的开源神经网络多模态模型宝藏》 一、多模态模型&#xff1a;开启智能交互新纪元二、主流 PC 端开源多模态模型大赏1. Obsidian&#xff1a;轻量级多模态先锋2. GLM-Edge 系列&#xff1a;移动端与 PC 端的全能选手3. Minicpm-llama3-v2.6&#xff1a;紧凑高效的多…

C#语言的数据库编程

C#语言的数据库编程 在现代软件开发中&#xff0c;数据库是不可或缺的一部分。无论是企业级应用还是个人项目&#xff0c;数据的存储与管理都是程序的核心功能之一。C#作为一种强类型、面向对象的编程语言&#xff0c;广泛应用于Windows平台的开发&#xff0c;尤其是在构建与数…

机器学习 - 如何理解几何学中的超平面 ?

线性回归公式 ywTxb 是数据建模中的基础&#xff1a; 数学上&#xff0c;它是一个线性函数。几何上&#xff0c;它是一个超平面。 那么如何理解超平面这个概念呢&#xff1f; 超平面&#xff08;hyperplane&#xff09;是几何学中的一个基本概念&#xff0c;尤其在高维空间和…

Mac远程控制电脑Windows怎么弄?

‌在Mac上远程控制Windows电脑通常需要借助专门的远程控制软件。本文将为您推荐一款操作简单、功能实用的远程控制软件&#xff0c;帮助您轻松实现Mac远程控制电脑Windows&#xff0c;提升工作效率&#xff0c;享受便捷操作。 远程看看软件是一款操作简单、界面美观的远程控制软…

机器翻译优缺点

随着科技的飞速发展&#xff0c;机器翻译是近年来翻译行业的热门话题&#xff0c;在人们的生活和工作中日益普及&#xff0c;使用机器能够提高翻译效率&#xff0c;降低成本。尽管关于机器翻译为跨语言交流带来了诸多便利&#xff0c;但在译文的正确率和局限性方面存在一定争议…