【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.rhkb.cn/news/303897.html

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

相关文章

图片管理系统:原理、设计与实践

title: 图片管理系统&#xff1a;原理、设计与实践 date: 2024/4/9 20:04:25 updated: 2024/4/9 20:04:25 tags: 图片管理存储组织上传采集处理编辑搜索检索展示分享AI应用 第一章&#xff1a;图片管理系统概述 1.1 图片管理系统简介 图片管理系统是一种用于存储、组织、处理…

Linux--进程的概念(一)

目录 一、冯诺依曼体系结构二、操作系统2.1 什么是操作系统2.2 操作系统的意义 三、进程3.1 进程的基本概念3.2 描述进程——PCB3.3 进程和程序的区别3.4 task_struct-PCB的一种3.5 task_struct的内容分类 四、如何查看进程4.1 通过系统文件查看进程4.2 通过ps指令查看进程 五、…

目标检测——车牌图像数据集

一、重要性及意义 车牌图像识别的重要性及意义主要体现在以下几个方面&#xff1a; 智能交通管理&#xff1a;车牌图像识别技术是智能交通系统&#xff08;ITS&#xff09;的核心组成部分。通过自动识别车辆车牌&#xff0c;可以实现对交通违章行为的自动记录和处理&#xff…

langchain 使用本地通义千问

langchian 使用已经下载到本地的模型&#xff0c;我们使用通义千问 显存&#xff1a;24G 模型&#xff1a;qwen1.5-7B-Chat&#xff0c;qwen-7B-Chat 先使用 qwen-7B-Chat&#xff0c;会报错用不了&#xff1a; 看了下是不支持这中模型&#xff0c;但看列表中有一个 Qwen 字样…

VPP 负载均衡测试代码

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

7B超越百亿级,北大开源aiXcoder-7B最强代码大模型,企业部署最佳选择

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 ​ 对代码大模型而言&#xff0c;比能做编程题更重要的&#xff0c;是看是能不能适用于企业…

SQL注入的其他攻击思路方法与Python脚本设计思路

SQL注入的其他攻击思路方法与Python脚本设计思路 也是很早就写了&#xff0c;也备个份吧 注意&#xff1a;在接下来的攻击方式中&#xff0c;由于实现的条件较为苛刻&#xff0c;并且需要较高权限&#xff0c;有的师傅又称之为高权限攻击 利用文件读取进行SQL注入 上一篇文章提…

Go第三方框架--ants协程池框架

1. 背景介绍 1.1 goroutine ants是站在巨人的肩膀上开发出来的&#xff0c;这个巨人是goroutine&#xff0c;这是连小学生都知道的事儿&#xff0c;那么为什么不继续使用goroutine(以下简称go协程)呢。这是个思考题&#xff0c;希望讲完本文大家可以有个答案。 go协程只涉及用…

【C语言】编译和链接

1. 翻译环境和运行环境 在ANSI C的任何⼀种实现中&#xff0c;存在两个不同的环境。 第1种是翻译环境&#xff0c;在这个环境中源代码被转换为可执⾏的机器指令&#xff08;⼆进制指令&#xff09;。 第2种是执⾏环境&#xff0c;它⽤于实际执⾏代码。 2. 编译环境 那翻译环境…

2024年腾讯云优惠券领取步骤使用教程详解

随着云计算技术的快速发展&#xff0c;越来越多的企业和个人开始选择使用云服务来提升自己的业务能力和工作效率。腾讯云作为国内领先的云服务提供商&#xff0c;其优质的服务和丰富的资源吸引了大量的用户。为了回馈广大用户&#xff0c;腾讯云经常会推出各种优惠活动&#xf…

Apache Log4j2 Jndi RCE CVE-2021-44228漏洞原理讲解

Apache Log4j2 Jndi RCE CVE-2021-44228漏洞原理讲解 一、什么是Log4j2二、环境搭建三、简单使用Log4j2四、JDNI和RMI4.1、启动一个RMI服务端4.2、启动一个RMI客户端4.3、ldap 五、漏洞复现六、Python批量检测 参考视频&#xff1a;https://www.bilibili.com/video/BV1mZ4y1D7K…

SQL注入---字符绕过

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.注释符绕过 当网页源代码中出现如下代码后&#xff0c;常见的注释符号将无效&#xff0c;因此需要通过特殊手段进行绕过 $reg "/#/"; $reg1 "/--/"; $replace &quo…

数据安全产品之认识数据脱敏系统

文章目录 一、什么是数据脱敏二、为什么要做数据脱敏三、数据脱敏系统的工作原理四、常见的数据脱敏方法五、数据脱敏系统的主要功能六、数据脱敏系统的部署方式七、数据脱敏与去标识化的关系与区别 随着业务的快速发展&#xff0c;特别是在银行、电信、医疗等行业中&#xff0…

第一个Swift程序

要创建第一个Swift项目,请按照以下步骤操作: 打开Xcode。如果您没有安装Xcode,可以在App Store中下载并安装它。在Xcode的欢迎界面上,选择“Create a new Xcode project”(创建新Xcode项目)。在模板选择界面上,选择“App”(应用程序)。在应用模板选择界面上,选择“Si…

PostgreSQL入门到实战-第九弹

PostgreSQL入门到实战 PostgreSQL数据过滤(二)官网地址PostgreSQL概述PostgreSQL中and操作理论PostgreSQL中and操作实操更新计划 PostgreSQL数据过滤(二) 了解PostgreSQL AND逻辑运算符以及如何使用它来组合多个布尔表达式。 官网地址 声明: 由于操作系统, 版本更新等原因, …

接口自动化测试(python+pytest+requests)

一、选取自动化测试用例 优先级高:先实现业务流程用例、后实现单接口用例功能较稳定的接口优先开展测试用例脚本的实现二、搭建自动化测试环境 核心技术:编程语言:python;测试框架:pytest;接口请求:requests安装/验证requests:命令行终端分别输入 pip install requests / p…

【LAMMPS学习】八、基础知识(1.6) LAMMPS 与其他代码耦合

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

理解 Golang 变量在内存分配中的规则

为什么有些变量在堆中分配、有些却在栈中分配&#xff1f; 我们先看来栈和堆的特点&#xff1a; 简单总结就是&#xff1a; 栈&#xff1a;函数局部变量&#xff0c;小数据 堆&#xff1a;大的局部变量&#xff0c;函数内部产生逃逸的变量&#xff0c;动态分配的数据&#x…

第十四届蓝桥杯大赛软件赛省赛C/C++大学 B 组

第十四届蓝桥杯大赛软件赛省赛C/C大学 B 组 文章目录 第十四届蓝桥杯大赛软件赛省赛C/C大学 B 组1、日期统计2、01串的熵3、冶炼金属4、飞机降落5、接龙数列6、岛屿个数7、子串简写8、整数删除9、景区导游10、砍树 1、日期统计 分析&#xff1a; 本题的意思就是2023年一整年&a…

基于SSM+Jsp+Mysql的超市管理系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…