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

news2024/11/30 6:53:19

【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.coloradmin.cn/o/1586355.html

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

相关文章

服务器端口被扫会出现哪些风险

一、安全风险增加端口扫描是黑客攻击的常见手段之一。通过对服务器端口进行扫描&#xff0c;黑客可以了解服务器的开放端口、服务类型以及可能存在的漏洞。一旦黑客发现漏洞并成功利用&#xff0c;就可能导致服务器被入侵&#xff0c;进而窃取数据、植入恶意软件或进行其他非法…

基于SSM的电影网站(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的电影网站&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringMv…

编程规范(保姆级教程)

文章目录 为什么需要编程规范&#xff1f;&#x1f4a1;代码检测工具 ESLint&#x1f4a1;代码格式化 Prettier&#x1f4a1;ESLint 与 Prettier 配合解决代码格式问题eslint支持ts约定式提交规范Commitizen助你规范化提交代码什么是 Git Hooks使用 husky commitlint 检查提交…

解决Idea中文乱码

解决 Idea 中文乱码问题的方法通常包括以下几个步骤&#xff1a; 1、调整文件编码&#xff1a;确保项目中的文件编码与 Idea 中的编码设置一致。通常情况下&#xff0c;使用 UTF-8 编码是比较合适的选择。你可以在 Idea 中通过 File -> Settings -> Editor -> File E…

在keil里用c++编程(1)

做嵌入式开发时&#xff0c;我们对使用c语言写的库有强烈的需求&#xff0c;比如eigen&#xff0c;boost等&#xff0c;但是通常来说&#xff0c;我们的开发是围绕c语言进行的&#xff0c;怎么把c的库文件放在c语言环境下进行编译&#xff0c;就是我们需要面对的问题 1.问题来…

代码随想录第36、37天| 435. 无重叠区间 763.划分字母区间 56. 合并区间

435. 无重叠区间 435. 无重叠区间 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 贪心算法&#xff0c;依然是判断重叠区间 | LeetCode&#xff1a;435.无重叠区间_哔哩哔哩_bilibili 给定一个区间的集合 intervals &#xff0c;其中 intervals[…

Python项目1 外星人入侵_外星人

在本章中&#xff0c;我们将在游戏《外星人入侵》中添加外星人。首先&#xff0c;我们在屏幕上边缘附近添加一个外星人&#xff0c;然后生成一群外星人。我们让这群外星人向两边和下面移 动&#xff0c;并删除被子弹击中的外星人。最后&#xff0c;我们将显示玩家拥有的飞船数量…

C/C++基础----运算符

算数运算符 运算符 描述 例子 两个数字相加 两个变量a b得到两个变量之和 - 两个数字相减 - * 两个数字相乘 - / 两个数字相除 - % 两个数字相除后取余数 8 % 3 2 -- 一个数字递减 变量a&#xff1a;a-- 、--a 一个数字递增 变量a: a 、 a 其中递…

容错组合导航

在初始值正确的情况下&#xff0c;惯性导航短期精度较高&#xff0c;但是其误差随着时间是累计的。如果要提高惯性导航的长期精度&#xff0c;就必须提高惯性器件的精度和初始读准精度&#xff0c;这必将大大提高成本。 如果将惯性导航与其他导航系统适当地组合起来&#xff0c…

开源项目若依放大招了?

前言 鉴于之前写了篇插件式相关的文章&#xff0c;阅读量比起其它文章可不要好太多&#xff0c;所以我决定继续这个主题&#xff01; 以前我们公司用的就是Ruoyi&#xff0c;代码比较简单易懂。但是有些功能确实用不上&#xff0c;比如部门和岗位&#xff0c;每次新项目我拉了…

Web程序设计-实验02 CSS页面布局

【实验主题】 影视网站前台模板页设计 【实验任务】 1、浏览并分析多个影视网站&#xff08;详见参考资源&#xff0c;建议自行搜索更多影视网站&#xff09;的整体版面布局&#xff0c;对比同一网站不同页面&#xff08;主页、列表页、详情页&#xff09;的元素异同——剔除…

探索ChatGPT-Plus:AI 助手全套开源解决方案

探索ChatGPT-Plus&#xff1a;AI 助手全套开源解决方案 ChatGPT-plus是一种新型的对话生成模型&#xff0c;它是在OpenAI的ChatGPT基础上进行了改进和优化的版本。ChatGPT-plus的出现引起了广泛关注&#xff0c;因为它在对话生成方面展现出了更加出色的表现和能力。在本文中&am…

MobX 中 runInAction 的威力:构建原子性状态更新

"原子性状态更新"这个词可以很好地概括 runInAction 的核心功能,即将一组相关的状态更新作为一个整体,要么全部成功,要么全部失败。这种特性对于复杂的异步操作和状态管理非常重要。可以帮助我们构建更加可靠和可预测的 React 应用程序。 怎么理解原子性操作 "…

动态调整学习率方法(仅供自己学习)

目录 一、StepLR 二、MultiStepLR 三、ExponentialLR 四、CosineAnnealingLR 五、ReduceLRonPlateau 六、LambdaLR 小结&#xff1a;学习率调整​​​​​​​ 一、StepLR optimizer torch.optim.SGD(model.parameters(), lrlearn_rate) scheduler torch.optim.lr_sch…

linux重定向符号

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

【C++初阶】C++简单入门(长期维护)

本篇博客是对C的一些简单知识分享&#xff0c;有需要借鉴即可。 C简单入门目录 一、C前言1.C的概念&#xff1a;2.C发展历程3.C如何学&#xff1f; 二、C入门1.C关键字(C98标准)2.命名空间3.C输入&输出①概念说明②使用说明③特征说明④细节拓展⑤cout与cin的意义 4.缺省参…

【24年软考】系统架构设计师论文写作技巧(附范文10篇)

1.快速审题 写作文要先审题&#xff0c;架构师论文命题也是如此。论文命题除了确定题目之外&#xff0c;还会给你写作要求。而这个写作要求会告诉你本命题涉及的知识点有哪些&#xff0c;并给你确立一个写作向。这个可以参考后面的论文真题分析。 2.确定题目 在填写并确认好…

MATLAB有限元结构动力学分析与工程应用-徐斌|【PDF电子书+配套Matlab源码】

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

wsl 2在windows11上的设置

详细参考&#xff1a;Manual installation steps for older versions of WSL | Microsoft Learn 1.系统组件要打开 分别是&#xff1a;Hyper-V、虚拟机平台、适用于Windows的Linux子系统 2.以管理员方式运行命令行&#xff0c;逐步执行下面的命令 update to WSL 2, you must…

篮球竞赛|基于Springboot的篮球竞赛预约平台系统设计与实现(源码+数据库+文档)

篮球竞赛预约平台目录 基于Springboot的篮球竞赛预约平台系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、前台&#xff1a; 2、后台 管理员功能 用户功能 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff…