【Entity Framework】聊聊EF中键

【Entity Framework】聊聊EF中键

文章目录

  • 【Entity Framework】聊聊EF中键
    • 一、概述
    • 二、配置主键
      • 2.1 约定配置主键
      • 2.2 单个属性配置为实体主键
      • 2.3 组合主键
    • 三、主键名称
    • 四、键类型和值
    • 五、备用键

在这里插入图片描述

一、概述

键用作每个实体实例的唯一标识符。EF中的大多数实体都有一个键,该键映射到关系数据库中主键的概念(对于没有键的实体,后面会讲解无键实体)。实体可以有出了主键之外的其他键。

二、配置主键

2.1 约定配置主键

根据约定,名为Id<type name>Id的属性将被配置为实体的主键。

public class User
{//主键public long Id{get;set;}public string Name{get;set;}public string EnName{get;set;}
}public class Address
{//主键public long AddressId{get;set;}public string AddressName{get;set;}public string Linkman{get;set;}public string phone{get;set;}
}

从属实体类型使用不同的规则来定义键

2.2 单个属性配置为实体主键

可将单个属性配置为实体的主键

  • 数据注释
public class User
{// key 注释定义关键字[Key]public long UUId{get;set;}public string Name{get;set;}public string EnName{get;set;}
}
  • Fluent API
protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<User>().HasKey(c => c.UUId);
}

2.3 组合主键

可以将多个属性配置为实体的键及组合键。约定仅在特定情况下设置复合键。

EF Core 7.0中引入了[PrimaryKey]属性。在旧版本中使用Fluent API

  • 数据注释
[PrimaryKey(nameof(Phone),nameof(UserCode))]
public class User
{public string Phone{get;set;}public string UserCode{get;set;}public string Address{get;set;}
}
  • Flument API
protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<User>().HasKey(c=>new{c.Phone,c.UserCode});
}

三、主键名称

根据约定,在关系数据库上,主键使用名称PK_<type_name>进行创建。可按如下方式配置主键约束的名称:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<User>().HasKey(b => b.UserId).HasName("PrimaryKey_UserId");
}

四、键类型和值

虽然EF Core支持使用任何基元类型的属性作为主键(包括string,guid,byte[]等),但并非所有数据库都支持所有类型作为键。在某些情况下,键值可以自动转换为支持的类型,否则应手动指定转换。

向上下文添加新实体时,键属性必须始终具有非默认值,但某些类型将由数据库生成。在这种情况下,当添加实体以用于跟踪时,EF将尝试生成一个临时值。调用SaveChanges后,临时值将替换为数据库生成的值。

如果键属性的值由数据库生成,并且在添加实体时指定了非默认值,则 EF 将假定该实体已存在于数据库中,并尝试更新它,而不是插入新的实体。 若要避免这种情况,请禁用值生成

五、备用键

除主键外,备选键还充当每个实体实例的备用唯一标识符;它可以用作关系的目标。使用关系数据库时,它会映射到备选键列上的唯一索引/约束的感念以及引用该列的一个或多个外键约束。

如果只想对列强制执行唯一性,请定义唯一索引而不是备选建。在EF中,备选建是只读的,并且提供对唯一索引的其他语义,因为他们可以用作外键的目标。

备选建通常根据需要引入,无需手动配置。根据约定,当你将不是主键的属性标识为关系的目标时,会引入备选键。

public class Blog
{public int BlogId{get;set;}public string Url{get;set;}public List<Post> Posts{get;set;}
}
public class Post
{public int PostId { get; set; }public string Title { get; set; }public string Content { get; set; }public string BlogUrl { get; set; }public Blog Blog { get; set; }
}
public class GoyeerContext : DbContext
{public DbSet<Blog> Blogs { get; set; }public DbSet<Post> Posts { get; set; }protected override void OnModelCreating(ModelBuilder modelBuilder){modelBuilder.Entity<Post>().HasOne(p => p.Blog).WithMany(b => b.Posts).HasForeignKey(p => p.BlogUrl).HasPrincipalKey(b => b.Url);}
}

还可将单个属性配置为备选建:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Car>().HasAlternateKey(c => c.LicensePlate);
}

还可将多个属性配置为备选键(即复合备选键):

protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Car>().HasAlternateKey(c => new { c.State, c.LicensePlate });
}

最后,根据约定,为备选键引入的索引和约束将命名为AK_<type name>_<property name>(复合备选键<property name>成为下列线分隔的属性名称列表)。可配置备选键的索引和唯一约束的名称。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Car>().HasAlternateKey(c => c.LicensePlate).HasName("AlternateKey_LicensePlate");
}

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

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

相关文章

VPP 负载均衡测试代码

1. 均衡的测试思想和流程说明。 先说一下理论&#xff0c; 然后后边才知道 代码逻辑。 调试了两天&#xff0c;这个代码终于通了。 由于时间关系&#xff0c; 画了一个粗略的图。另外这个代码只是流程通了&#xff0c;不过要帮助理解负载均衡我认为已经足够了。 下面是windo…

QT Creator概览

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;QT❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、Qt Creator 概览 ①&#xff1a;菜单栏 ②&#xff1a;模式选择 ③&#xff1a;构建套件选择器…

【Keil5-Debug和发布版本配置】

Keil5-Debug和发布版本配置 ■ Keil5-Debug和发布版本配置■ 一&#xff1a;sct文件 sct文件配置■ 二&#xff1a;发布版本不需要在 C/C&#xff0c;Asm&#xff0c;Linker&#xff0c;中添加 CMDDEBUG 宏定义。■ 三&#xff1a;Debug版本需要在Linker添加 --pd"-DCMDDE…

【MySQL数据库 | 第二十四篇】Limit语句的性能问题和调优策略

前言&#xff1a; MySQL作为最流行的关系型数据库管理系统之一&#xff0c;被广泛应用于各种规模和类型的应用程序中。其强大的功能和灵活的查询语言使得开发人员能够高效地执行各种数据操作和分析。 然而&#xff0c;在处理大量数据或复杂查询时&#xff0c;一些开发人员可能…

Linux网卡:连接虚拟与现实的桥梁

在介绍Linux网卡之前&#xff0c;让我们先迈入时光机&#x1f570;️&#xff0c;回到1980年代末期&#xff0c;互联网正在逐步从一个科研网络向公众网络转变&#xff0c;Linux——一个自由和开源的操作系统诞生了&#x1f427;。Linux的出现&#xff0c;对于计算机科学领域来说…

非线性滤波相位解缠算法

相位解缠是InSAR数据处理流程中较为关键的步骤&#xff0c;同时也是地表高程模型重建 过程中的主要误差来源之一。迄今为止&#xff0c;针对干涉图的相位解缠问题&#xff0c;已经提出了各 种各样的相位解缠算法&#xff0c;这些算法大致可以分为以下几类&#xff1a;①路径跟踪…

DSP笔记13-时间基准子模块Time base(TB)比较子模块Counter cpmpare(CC)

时间基准子模块Time base(TB) 同步&#xff0c;计数 CTR计数寄存器 PRD周期寄存器 CMP比较寄存器&#xff0c;占空比 EPWMA&#xff0c; EPWMB&#xff0c;两个比较寄存器&#xff0c;但只有以及计数寄存器以及一个周期寄存器 计数模式 计数时钟TBCLK HSPCLKDIVx x0,分…

《QT实用小工具·二十三》 Ntp校时类

1、概述 源码放在文章末尾 该项目实现了 Ntp校时类 &#xff0c;包含如下功能&#xff1a; 可设置Ntp服务器IP地址。 推荐用默认的阿里云时间服务器 ntp1.aliyun.com 收到时间信号发出。 时间精确到秒。 下面是demo演示&#xff1a; 项目部分代码如下&#xff1a; #if…

在线视频下载工具lux(原annie)安装及使用教程

安装教程 下载ffmpeg&#xff0c;参考这篇文章&#xff1a;Python——Windows下载ffmpeg由于博主的系统为windows&#xff0c;所以选择不安装lux&#xff0c;直接下载.exe文件&#xff0c;进入lux的github网站后&#xff0c;选择右侧的Releases&#xff0c;下载下图的windows …

SpringBoot删除菜品模块开发(SpringMVC分割参数、事务管理、异常处理、批量删除)

需求分析与设计 一&#xff1a;产品原型 在菜品列表页面&#xff0c;每个菜品后面对应的操作分别为修改、删除、停售&#xff0c;可通过删除功能完成对菜品及相关的数据进行删除。 删除菜品原型&#xff1a; 业务规则&#xff1a; 可以一次删除一个菜品&#xff0c;也可以批…

【proteus仿真】定时器0中断实验

#include <REGX51.H> sbit LED1P2^0; void delay(unsigned int ten_s) {while(ten_s--); } void inittime0(void) {TMOD0x01;//选择为定时器0模式&#xff0c;工作方式1TH00xFC;//初值65536-100064536FC18H,定时1msTL00x18;ET01;//打开定时器0中断允许EA1;//打开总中断TR…

InternLM2 技术报告——社区翻译版

InternLM2技术报告于近日正式对外发布&#xff0c;不少社区大佬自发地参与到报告的翻译与解读中来。本文为社区用户翻译的InternLM2技术报告原文&#xff0c;分享给大家~ 论文地址&#xff1a; https://arxiv.org/pdf/2403.17297.pdf 摘要 大型语言模型&#xff08;LLMs&…

Java基础常见面试总结

文章目录 1. 变量、数据类型转换、运算符1.1 变量1.2 数据类型转换1.2.1强转的注意事项 1.3 进制的转换1.4 位运算符1.5 运算符1.6 三元运算符 2. 流程控制2.1 键盘录入_Scanner2.2 Random随机数2.3 switch(选择语句)2.4 分支语句2.5 循环语句 3. 数组3.1 数组的定义3.2 数组操…

证件照小于30kb怎么弄?这个工具三步搞定

当我们需要将照片上传到各种平台时&#xff0c;常常会遇到图片文件大小限制的问题。无论是社交媒体平台还是工作需求&#xff0c;如果照片文件过大&#xff0c;系统会提示上传失败或无法上传。想要解决的这个问题&#xff0c;可以选择将图片压缩指定大小&#xff0c;比如图片压…

蓝桥杯-求阶乘

问题描述 满足 N!的末尾恰好有 区 个o的最小的 N 是多少? 如果这样的 N 不存在输出 -1。 输入格式 一个整数 区。 输出格式 一个整数代表答案。 样例输入 样例输出 10 评测用例规模与约定 对于 30% 的数据,1<K<106 对于 100% 的数据,1<K<1018 运行限制 最大运行时…

【Git教程】(九)版本标签 —— 创建、查看标签,标签的散列值,将标签添加到日志输出中,判断标签是否包含特定的提交 ~

Git教程 版本标签&#xff08;tag&#xff09; 1️⃣ 创建标签2️⃣ 查看存在的标签3️⃣ 标签的散列值4️⃣ 将标签添加到日志输出中5️⃣ 判断tag是否包含特定的提交&#x1f33e; 总结 大多数项目都是用 1.7.3.2和 “ gingerbread” 这样的数字或名称来标识软件版本的。在 …

数字图像处理与交叉学科中名词的拧巴

特征提取 图像处理——对图像、目标或特征点进行定量描述的方法及过程。 模式识别——对原特征进行特征变换&#xff0c;从高维空间到低维空间映射。 特征向量 模式识别、图像处理——一个观测包括多个变量&#xff0c;样本的多个特征组成特征向量。 线性代数——特征值对应的…

[闲聊统计]之参数估计是什么?(下)

我们在前面说了一下参数估计中的点估计&#xff0c;接下来&#xff0c;我们来讲一下区间估计。 区间估计——在点估计的基础上&#xff0c;给出总体参数估计的一个估计区间&#xff0c;该区间由样本统计量加减估计误差而得到。 置信水平——如果将构造置信区间的步骤重复多次&a…

javaWeb新闻发布及管理系统

摘 要 随着电脑、智能手机等能够连接网络设备的家庭化和大众化&#xff0c;各种网站开始被设计和开发出来&#xff0c;功能多种多样&#xff0c;涉及的领域也各有不同&#xff0c;生活、商业、科技等等。而信息的发布是网络的一大特点&#xff0c;人们上网的主要需求就是汲取自…

中高级前端需要掌握哪些Vue底层原理

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…