EFCore HasDefaultValueSql (续1 ValueGeneratedOnAdd)

news2025/1/13 0:57:15

前情: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.coloradmin.cn/o/2275735.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

仓颉笔记——写一个简易的web服务并用浏览器打开

创建一个web服务端&#xff0c;同时创建一个客户端去读取这个服务端。 也满足浏览器打开web的需求。 直接上代码。 import net.http.* import std.time.* import std.sync.* import std.log.LogLevel// 1. 构建 Server 实例 let server ServerBuilder().addr("127.0.0.1&…

Trie树算法

Trie树&#xff0c;也称为前缀树或字典树&#xff0c;是一种特殊的树型数据结构。它用于存储一组字符串&#xff0c;使得查找、插入和删除字符串的操作非常高效。类似这种&#xff0c; 模板&#xff1a; 这是用数组来模拟上图中的树的结构&#xff0c;逻辑上和上图结构一致。 …

03-51单片机定时器和串口通信

一、51单片机定时器 1.定时器介绍 1.1为什么要使用定时器 在前面的学习中&#xff0c;用到了 Delay 函数延时&#xff0c;这里学习定时器以后&#xff0c;就可以通过定时器来完成&#xff0c;当然定时器的功能远不止这些&#xff1a; 51 单片机的定时器既可以定时&#xff…

搭建docker私有化仓库Harbor

Docker私有仓库概述 Docker私有仓库介绍 Docker私有仓库是个人、组织或企业内部用于存储和管理Docker镜像的存储库。Docker默认会有一个公共的仓库Docker Hub,而与Docker Hub不同,私有仓库是受限访问的,只有授权用户才能够上传、下载和管理其中的镜像。这种私有仓库可以部…

【深度学习】核心概念-人工神经网络(Artificial Neural Network, ANN)

人工神经网络是一种受生物神经系统启发的机器学习模型&#xff0c;旨在通过连接大量的节点&#xff08;称为神经元或节点&#xff09;来模拟人脑的学习方式。它是一种在监督学习和非监督学习中广泛应用的深度学习模型。 人工神经网络的基本结构 一个人工神经网络通常由以下三个…

切比雪夫插值

切比雪夫插值是一种基于切比雪夫节点的多项式插值方法&#xff0c;其优势是减少插值误差(特别是龙格现象&#xff1a;表现为高维插值时在边缘处插值误差骤增)。本文对其基本操作进行说明。 1. 切比雪夫节点 切比雪夫插值的核心是使用切比雪夫节点作为插值点。切比雪夫节点是切…

ELK的搭建

ELK elk&#xff1a;elasticsearch logstatsh kibana统一日志收集系统 elasticsearch&#xff1a;分布式的全文索引引擎点非关系型数据库,存储所有的日志信息&#xff0c;主和从&#xff0c;最少需要2台 logstatsh&#xff1a;动态的从各种指定的数据源&#xff0c;获取数据…

【物联网原理与运用】知识点总结(上)

目录 名词解释汇总 第一章 物联网概述 1.1物联网的基本概念及演进 1.2 物联网的内涵 1.3 物联网的特性——泛在性 1.4 物联网的基本特征与属性&#xff08;五大功能域&#xff09; 1.5 物联网的体系结构 1.6 物联网的关键技术 1.7 物联网的应用领域 第二章 感知与识别技术 2.1 …

英文字体:复古八十年代优雅品牌邀请函电影标题设计衬线字体 Eighties Nostalgia Font

嘿&#xff0c;大家好&#xff0c;我希望你们一切顺利&#xff0c;考虑到现在世界上发生的一切&#xff0c;你们在生活的各个方面都取得了进步。过去 3 年对我们所有人来说都是过山车&#xff0c;我一直非常怀念美好的时光。怀旧之情将我带到了 Pinterest&#xff0c;自然而然地…

GPT大模型下,如何实现网络自主防御

近年来&#xff0c;随着GPT大模型的出现&#xff0c;安全领域的攻防对抗变得更加激烈。RSAC2023人工智能安全议题重点探讨了人工智能安全的最新发展&#xff0c;包括人工智能合成器安全、安全机器学习以及如何利用渗透测试和强化学习技术来确保人工智能模型的安全性和可靠性。 …

Spring Framework 5.3.x源码构建 (jdk-1.8, gradle 7.5.1, idea2024.3)

1、下载jdk安装并配置环境变量&#xff08;自行百度&#xff09; https://www.oracle.com/java/technologies/downloads/#java8 2、下载spring-framework源码&#xff0c;切换分支到5.3.x https://github.com/spring-projects/spring-framework.git 备用地址 https://gitco…

韩顺平老师Linux学习笔记【持续更新...】

1、课程内容 1.1、课程大纲 1.2、Linux使用在哪些地方 Linux运维工程师Linux嵌入式工程师Linux下开发项目&#xff1a;JavaEE、大数据、Python、PHP、C/C、Go 1.3、Linux的应用领域 个人桌面领域服务器领域&#xff08;最强领域&#xff09;嵌入式领域 2、Linux入门 2.1、…

代码随想录算法训练营day27

代码随想录算法训练营 —day27 文章目录 代码随想录算法训练营前言一、贪心算法理论基础二、455.分发饼干三、376. 摆动序列53. 最大子数组和总结 前言 今天是算法营的第27天&#xff0c;希望自己能够坚持下来&#xff01; 今日任务&#xff1a; ● 贪心算法理论基础 ● 455.…

浅谈容灾技术方案详解

一、什么是容灾&#xff1f; 容灾指的是&#xff0c;在异地搭建一套或多套和主生产系统一样的IT系统&#xff0c;用于应对在系统因发生意外&#xff08;自然灾害、人为灾害、设备系统故障等&#xff09;造成业务影响的情况&#xff0c;达到尽量让生产业务损失最小的目的。 二…

《框架程序设计》期末复习

目录 Maven 简介 工作机制&#xff08;★&#xff09; 依赖配置&#xff08;★&#xff09; Maven命令 MyBatis 入门 单参数查询&#xff08;★&#xff09; 多参数查询&#xff08;★★★&#xff09; 自定义映射关系&#xff08;★★★&#xff09; 基本增删改查操…

SDK调用文心一言如何接入,文心一言API接入教程

一、前期准备 注册百度智能云账号&#xff1a; 前往百度智能云官网注册一个账号。这是接入文心一言API的基础。 了解API接口&#xff1a; 在百度智能云开放平台中&#xff0c;找到文心一言API的详情页&#xff0c;了解提供的API接口类型&#xff08;如云端API、移动端API、离线…

刚体变换矩阵的逆

刚体运动中的变换矩阵为&#xff1a; 求得变换矩阵的逆矩阵为&#xff1a; opencv应用 cv::Mat R; cv::Mat t;R.t(), -R.t()*t

<style lang=“scss“ scoped>: 这是更常见的写法,也是官方文档中推荐的写法

这两种写法在大多数情况下是没有区别的&#xff0c;它们都是 Vue.js 单文件组件 (.vue 文件) 中用来定义组件私有样式的方式。 两种写法&#xff1a; <style lang"scss" scoped>: 这是更常见的写法&#xff0c;也是官方文档中推荐的写法。<style scoped l…

ai,seo,关键词

什么是AI在SEO中的应用 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;在搜索引擎优化&#xff08;SEO&#xff09;领域的应用正变得愈发重要。AI技术能够处理和分析大量的数据&#xff0c;通过识别用户行为和搜索模式&#xff0c;帮助优化网站内容和结构。…

git - 用SSH方式迁出远端git库

文章目录 git - 用SSH方式迁出远端git库概述笔记以gitee为例产生RSA密钥对 备注githubEND git - 用SSH方式迁出远端git库 概述 最近一段时间&#xff0c;在网络没问题的情况下&#xff0c;用git方式直接迁出git库总是会失败。 失败都是在远端, 显示RPC错误。 但是git服务器端…