当前位置: 首页 > article >正文

EFCore HasDefaultValueSql (续1 ValueGeneratedOnAdd)

前情: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.kler.cn/a/500587.html

相关文章:

  • SQL美化器优化
  • qt 快捷功能 快速生成 setter getter 构造函数 父类虚函数重写 成员函数实现 代码框架 查看父类及父类中的虚函数
  • 2024年度漏洞态势分析报告,需要访问自取即可!(PDF版本)
  • 【2024年华为OD机试】 (A卷,100分)- 总最快检测效率(Java JS PythonC/C++)
  • 【Linux】文件 文件描述符fd
  • Matplotlib 直方图:数据可视化基础
  • 金融项目实战 04|JMeter实现自动化脚本接口测试及持续集成
  • PHP语言的软件工程
  • VSCode配置php开发环境
  • Microsoft Sql Server 2019 视图
  • 第六届土木建筑及灾害防控国际学术会议暨第三届智慧城市建筑与基础设施耐久性国际学术会议(CADPC DuraBI 2025)
  • 33_操作Redis分片集群
  • 用C语言实现推箱子小游戏
  • windows C#-泛型方法
  • Python----Python基础(字符串,列表,元组,字典,集合的总结)
  • 【CSS】设置滚动条样式
  • 【源码解析】Java NIO 包中的 MappedByteBuffer
  • 一文详解YOLOv8多模态目标检测(可见光+红外图像,基于Ultralytics官方代码实现),轻松入门多模态检测领域!
  • 金融项目实战 03|JMeter脚本实现手工接口测试
  • 【微信小程序】回到顶部图标-页面滚动事件 | 漫画-综合实训
  • 深度学习中的EMA技术:原理、实现与实验分析
  • 计算机网络之---传输层的功能
  • conntrack iptables 安全组
  • Oracle 使用dbms_stats.gather_table_stats来进行表analyse,收集表统计信息
  • 《零基础Go语言算法实战》【题目 2-7】defer 关键字特性
  • spring boot 支持jsonp请求