【Entity Framework】如何使用EF中的生成值

【Entity Framework】如何使用EF中的生成值

文章目录

  • 【Entity Framework】如何使用EF中的生成值
    • 一、概述
    • 二、默认值
    • 三、计算列
    • 四、设置主键
    • 五、显示配置值生成
    • 六、设置日期/时间值生成
      • 6.1 创建时间戳
      • 6.2 更新时间戳
    • 七、替代值生成
    • 八、无值生成
    • 九、总结

在这里插入图片描述

一、概述

数据库列的值可以通过多种方式生成:主键列通常是自动递增的整数,其他列具有默认值或计算值等。本文详细介绍使用 EF Core 配置值生成的各种模式。

二、默认值

在关系数据库中,可以为列配置默认值;如果插入的行没有该列的值,则将使用默认值。

可以在属性上配置默认值

protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Blog>().Property(b => b.state).HasDefaultValue(true);
}

可指定用于计算默认值的 SQL 片段

protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Blog>().Property(b => b.Created).HasDefaultValueSql("getdate()");
}

三、计算列

大多数关系数据库中,可以将列配置为在数据库中计算其值,并且通常使用引用其他列的表达式:

modelBuilder.Entity<Person>().Property(p => p.DisplayName).HasComputedColumnSql("[LastName] + ', ' + [FirstName]");

以上命令将创建一个虚拟计算列,每次从数据库中提取时都会计算其值。可以将计算列指定微存储(有时称为持久化)计算列,这意味着系统会在每次更新行时计算该值,并将其与常规列一起存储在磁盘上:

modelBuilder.Entity<Person>().Property(p => p.NameLength).HasComputedColumnSql("LEN([LastName]) + LEN([FirstName])", stored: true);

四、设置主键

按照约定,如果应用程序未提供值,则将类型为short、int、long或Guid的非复合主键设置为针对插入的实体生成值。数据库提供程序通常负责必要的配置;

详细内容请于阅读聊聊EF中的键

五、显示配置值生成

EF Core会自动为主键设置值生成-但我们可能希望对非键属性 执行相同的操作。可以将任何属性配置为针对插入的实体生成其值,具体如下所示:

  • 数据注释
public class Lessess
{public int LessessId{get;set;}public string LessessCode{get;set;}public string LessessName{get;set;}//显示配置值生成[DatabaseGenerated(DatabaseGeneratedOption.Identity)]public DateTime Inserted{get;set;}
}
  • Fluent API
protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Lessess>().Property(b => b.Inserted).ValueGeneratedOnAdd();
}

同样,可以将属性配置为在添加或更新时生成其值:

  • 数据注释
public class Lessess
{public int LessessId{get;set;}public string LessessCode{get;set;}public string LessessName{get;set;}//显示配置值生成[DatabaseGenerated(DatabaseGeneratedOption.Computed)]public DateTime Inserted{get;set;}
}
  • Fluent API
protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Lessess>().Property(b => b.LastUpdated).ValueGeneratedOnAddOrUpdate();
}

与默认值或计算列不同,再没有指定值的生成方式;这取决于所使用的数据库提供程序。数据库提供程序可能会自动为某些属性类型设置值生成,但其他属性类型可能需要你手动设置值的生成方式。

同样,配置为在添加或更新时生成值并标记为并发标记的byte[]属性将设置为rowversion数据类型,以便在数据库中自动生成值。但是指定ValueGeneratedOnAdd不起作用。

六、设置日期/时间值生成

常见的请求时获取一个数据列,其中包含第一次插入行的日期/时间(在添加时生成的值)或上次更新行的日期/时间(添加或更新时生成的值)。由于可通过各种策略执行此操作,因此EF Core提供程序通常不会为日期/时间列自动设置值生成-必须自动设置;

6.1 创建时间戳

若要将日期/时间列配置为包含行的创建时间戳,通常需要使用适当的SQL函数来配置默认值。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Blog>().Property(b => b.Created).HasDefaultValueSql("getdate()");
}

请确保选择适当的函数,因为可能存在多个函数(例如 GETDATE()GETUTCDATE())。

6.2 更新时间戳

尽管存储计算列看起来非常适合管理上次更新时间戳,但数据库通常不允许在计算列中指定诸如GETDATE()之类的函数。作为替代方法,你可以设置一个数据库触发器来达到同样的效果。

七、替代值生成

尽管为属性配置了值生成,但在许多情况下,你仍然可以为其显式指定一个值。 此操作能否真正起作用取决于已配置的特定值生成机制;虽然你可以指定显式值而不是使用列的默认值,但不能对计算列执行相同的操作。

若要使用显示值替代值生成,只需将属性设置为该属性类型的CLR默认值(string为null,int为0,Guid为Guid.Empty,等等)以外的任意值。

若要为已配置为在添加或更新时生成值的属性提供显示值,必须按以下方式配置该属性:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Blog>().Property(b => b.LastUpdated).ValueGeneratedOnAddOrUpdate().Metadata.SetAfterSaveBehavior(PropertySaveBehavior.Save);
}

八、无值生成

除了上述特定方案外,属性通常不会配置值生成;这意味着,始终由应用程序提供要保存到数据库的值。必须先将此值分配给新实体,然后才能将新实体添加到上下文中。

但是,在某些情况下,你可能希望禁用按约定设置的值生成。 例如,int 类型的主键通常隐式配置为 value-generated-on-add(例如 SQL Server 上的 identity 列)。 你可以通过以下命令禁用此功能:

  • 数据注释
public class User
{[DatabaseGenerated(DatabaseGeneratedOption.None)]public int UserId { get; set; }public string LoginName { get; set; }
}
  • Fluent API
protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<User>().Property(b => b.UserId).ValueGeneratedNever();
}

九、总结

Entity Framework提供多种在应用端生成值的能力。在实际开发中,需要考虑在数据库层还是在应用层完成这些值的自动匹配和完成值的生成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/808297.shtml

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

相关文章

DHCP抓包分析

DHCP动态路由配置协议&#xff0c;是C/S架构&#xff0c;由DHCP服务器为客户端动态分配IP信息。 DHCP客户端首次接入网络数据交互过程&#xff1a; 如何解决IP地址的冲突&#xff1a; ▫ DHCP服务器端&#xff1a;收到DHCP DISCOVER报文时&#xff0c;给客户端分配IP地址前会发…

【C++第三阶段】stackqueue容器

以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 stack容器queue容器 stack容器 是什么&#xff1f;功能是什么&#xff1f;常用接口是什么&#xff1f;局限性有哪些&#xff1f;优势又有哪些&#xff1f; 栈容器&#xff0c;先进…

error-ckeditor-duplicated-modules 在vue中引入ckeditor插件报错

报错原因&#xff1a; 由于集成了webpack&#xff0c;统一引入了ckeditor &#xff0c;但是页面里面我们又通过import引入了一遍&#xff0c;所以导致引入重复了 解决&#xff1a; ckeditor本身除了基本的一些功能&#xff0c;其他基本全靠插件引入&#xff0c;所以想加功能必…

谷歌推出Vids:AI驱动的PowerPoint,重新定义演示文稿的未来|TodayAI

不管你喜不喜欢&#xff0c;找到集成了AI技术以简化常见任务的工具和服务变得越来越容易。谷歌的应用套件迅速成为了一个集成了Gemini AI的产品中心&#xff0c;这些产品可以在工作场所到你的家中的任何地方使用。例如&#xff0c;如果在工作中做演示一直是你的痛点&#xff0c…

git操作码云(gitee)创建仓库到上传到远程仓库

想必有的小伙伴在为上传到码云远程仓库而感到烦恼吧&#xff01;本篇为大家详细讲解实现过程&#xff0c;跟着我的步伐一步一步来。 我就当大家已经注册好了码云 一、在码云上需要的操作 接下来我们需要使用到 git 了 二、git 上的操作 到了咋们的git了&#xff0c;开整 首…

外包干了3天,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;19年通过校招进入杭州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

Terraform 状态不同步处理

背景 在使用 Terraform 创建 TencentCloud TKE 的时候&#xff0c;手贱把 node pool 删掉了。导致执行 destroy, plan 都会报错。 │ Error: [TencentCloudSDKError] CodeInternalError.UnexpectedInternal, Messagerelated node pool query err(get node pool failed: [E501…

Python如何安装第三方模块

cmd窗口中使用pip install命令安装 1、键盘按下win R&#xff0c;然后在输入框中输入cmd&#xff0c;回车&#xff0c;就打开了cmd窗口。 下图的运行框会出现到屏幕左下角。 2、输入下面的命令&#xff0c;回车即可。 pip install xxx # xxx为要安装的模块名 如图所示&…

【13137】基于TQM的人力资源管理

目录 1.单选题 2.多选题 3.名词解释题 4.简答题 1.单选题

中通科技数仓数据治理实践

目录 一、背景 1.1 中通数仓架构介绍 1.2 中通数仓层级划分 1.3 中通数据现状 1.4 中通数仓现面临的压力 二、数据仓库具体实践 2.1 时效治理 2.1.1 数据入仓治理 2.1.2 核心模型治理 2.2 存储治理 2.3 内存治理 2.3.1 内存浪费治理 2.3.2 数据倾斜治理 2.3.3 内…

算法设计与分析实验报告c++java实现(ACM面试题、字符串匹配算法、循环赛日程安排问题、分治法求解最大连续子序列和、动态规划法求解最大连续子序列和)

一、 实验目的 1&#xff0e;加深学生对算法设计方法的基本思想、基本步骤、基本方法的理解与掌握&#xff1b; 2&#xff0e;提高学生利用课堂所学知识解决实际问题的能力&#xff1b; 3&#xff0e;提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 1、【ACM、…

linux重定向符号

将ls命令执行结果重定向到a文件中 将错误ls命令执行结果重定向到a文件中&#xff08;这里用到前面的标准错误输出重定向&#xff09;

科研学习|可视化——相关性结果的可视化

一、相关性分析介绍 相关性分析是指研究两种或者两种以上的变量之间相关关系的统计分析方法&#xff0c;一般分析步骤为&#xff1a; 1&#xff09;判断变量间是否存在关联&#xff1b;2&#xff09;分析关联关系&#xff08;线性/非线性&#xff09;、关联方向&#xff08;正相…

上海人工智能实验室的书生·浦语大模型学习笔记(第二期第三课——上篇)

书生浦语是上海人工智能实验室和商汤科技联合研发的一款大模型&#xff0c;这次有机会参与试用&#xff0c;特记录每次学习情况。 一、课程笔记 本次学习的是RAG&#xff08;Retrieval Augmented Generation&#xff09;技术&#xff0c;它是通过检索与用户输入相关的信息片段…

基于SSM的大学生兼职平台的设计与实现需求(源码+配套文档)

基于SSM的大学生兼职平台的设计与实现需求&#xff08;源码配套文档&#xff09; 摘 要 信息社会、信息时代造就了现在我们所拥有的科技生活。各种关于生活、社团的互联网软件逐步的走向了百姓的生活当中&#xff0c;移动互联网在当下的时代中有着非常成熟的应用&#xff…

【nodejs基础学习三-浏览器偏好设置】

系列文章目录 第一章 nodejs基础学习–注释、变量、运算符、字符串、函数&#xff08;一&#xff09; 第二章 nodejs基础学习–循环、对象字符、模块导入出&#xff08;二&#xff09; 第三章 nodejs基础学习三-浏览器设置 系列文章目录一、开发者模式二、web偏好设置 一、开发…

1.网络编程-网络协议

目录 网络编程是什么 网络编程三要素 OSI七层网络模型 TCP/IP五层模型 SSL/TLS 是哪层协议 网络编程是什么 网络编程是计算机科学中的一个重要领域&#xff0c;它涉及到编写能够在网络环境中进行通信的程序。网络编程的核心目标是使不同的设备能够通过网络交换信息&#…

【前端Vue】Vue3+Pinia小兔鲜电商项目第5篇:整体认识和路由配置,本资源由 收集整理【附代码文档】

Vue3ElementPlusPinia开发小兔鲜电商项目完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;认识Vue3&#xff0c;使用create-vue搭建Vue3项目1. Vue3组合式API体验,2. Vue3更多的优势,1. 认识create-vue,2. 使用create-vue创建项目,1. setup选项的写法和执行…

万亿资产规模,一个指标平台,银行业数据赋能经营的最佳实践

为了适应经营环境变化&#xff0c;企业的发展模式需要转向高质量发展。在数字经济时代&#xff0c;借助数字化手段实现数字化经营&#xff0c;是企业实现高质量发展的必由之路。 指标平台逐渐成为企业数据基础设施中的重要组成部分。企业可以借助指标平台对数据资产进行便捷化…

全面的网络流量监控

流量监控指的是对数据流进行的监控&#xff0c;通常包括出数据、入数据的速度、总流量。通过网络流量监控&#xff0c;组织可以确保只有业务关键型流量通过网络传输&#xff0c;并限制不需要的网络流量&#xff0c;从而提高网络效率&#xff0c;又可以防止停机、减少 MTTR、帮助…