查缺补漏系统学习 EF Core 6 - 实体配置

推荐关注「码侠江湖」星标,时刻不忘江湖事

这是 EF Core 系列的第二篇文章,上一篇文章讲解了 EF Core 的一些基础概念,这一篇文章主要围绕实体属性的配置。

点击上方或后方蓝字,阅读 EF Core 系列合集。

bc9487f3b6041600a956476be54e1bca.png

实体配置

配置实体的目的,是为了让实体属性与数据库表字段实现正确的映射。

EF Core 有三种方式来配置实体:按约定、数据注释、Fluent API,下面依次进行阐述。

按约定配置

按约定配置,是指 EF Core 遵循一套关于属性类型和名称的简单规则,并相应地配置数据库。

按约定的配置,可以被数据注释(特性)或 Fluent API 重写。

比如,下面这个示例中:

public class Account
{public Guid AccountId { get; set; }public string Name { get; set; }public int Age { get; set; }
}

EF Core 通过遵循命名规则,来配置 Account 实体类中的主键字段。

如果实体类拥有一个名为 Id 的属性,或一个<类名+Id>的组合,它就会被作为主键。

如果实体类中有一个复合主键,我们就不能按约定配置了。

当 EF Core 使用按约定的配置时,它会遍历所有的公共属性,并通过它们的名称和类型来映射它们。

示例中,Name 属性是一个可以为 Null 的字段,因为字符串类型的默认值是 Null

Age 属性不会为 Null,因为它是一个值类型。

当然,如果你想让 Age 属性,在数据库中可以为 Null,那需要在类型后加上 「?」 后缀:

public int? Age { get; set; }

数据注释

数据注释的表现形式就是特性,它不仅可以用来配置实体属性,还可以永远验证实体数据是否合法。

我们来替换一下 Account 实体类中的内容:

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;namespace ConsoleApp1.Entities
{[Table("Account")]public class Account{[Column("AccountId")]public Guid Id { get; set; }[Required][MaxLength(50, ErrorMessage = "长度必须小于50个字符")]public string Name { get; set; }public int Age { get; set; }}
}

Name 属性的特性,它就是数据注释的一种,来自 System.ComponentModel.DataAnnotations 命名空间,这个命名空间中的属性主要与约束有关。

Required 属性,说明 Name 字段不能为空;MaxLengh 属性,限制了数据库中该列的长度。

Account 类型与 AccountId 属性的特性,也属于数据注释。

不过,它们来自于 System.ComponentModel.DataAnnotations.Schema 命名空间,这个命名空间中的属性主要与数据库配置有关。

默认情况下,实体类映射到数据库中的表名,与上下文类中 DbSet 属性名有关。

比如 DbSet<Account>,它的属性名是 Accounts,所以映射到数据库中的表名就是 Accounts。但是使用了 「Table」 特性就会覆盖这个默认行为。

「Column」 特性,则可以为 EF Core 提供,该属性映射到数据库中的列信息。

如果你想在代码中使用 Account 类的 Id 属性,而不是 AccountId,而又想让它在数据库中,以 AccountId 字段名表示,那么就需要使用 「Column」 特性。

「Column」 特性中还有其它的一些参数,比如字段的顺序与数据库中的类型等,简单来说,它可以定义属性在数据库中的形式。

Fluent API

Fluent API 是一组方法,这些方法提供了大量的 EF Core 配置选项,用来在上下文类中配置实体。

我们可以在 ApplicationContext 类中,添加这么一段代码:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Account>().ToTable("Account");modelBuilder.Entity<Account>().Property(s => s.Id).HasColumnName("AccountId");modelBuilder.Entity<Account>().Property(s => s.Name).IsRequired().HasMaxLength(50);modelBuilder.Entity<Account>().Property(s => s.Age).IsRequired(false);
}

Fluent API 可以在 OnModelCreating 方法中使用,这段配置与前面的数据注释拥有同样的效果。

Fluent API 的使用,需要在一开始,就选择需要配置的实体,然后通过 Property 方法,指定需要添加约束的属性,其他的方法就很清晰明了了。

OnModelCreating 方法会在 ApplicationContext 类第一次实例化时被调用。也就是在这一刻,所有的三种实体配置方式都会被应用。

由于配置规则非常多,而常用的又并不多,所以更多的配置规则,大家可以通过 EF Core 官方文档去查阅。

配置方式的选择

现在,我们主要来说一说,这三种配置方式, 我们应该怎么选择?

「首先是按约定配置,」这个永远都是我们的首选。

因为,拥有与表名相同的类名、拥有与命名约定相匹配的主键属性名,以及拥有与列相同的名称和类型的属性,是我们的首选。这样不需要我们做太多的工作。

「然后是数据注释」,它不仅可以配置实体,最重要的是可以实现数据验证,如必填或最大长度验证等,我们应该使用数据注释,而不是 Fluent API 方法。

原因在于,我们可以很容易的看到,哪个验证规则与哪个属性有关,因为它就在属性的上方,而且具有语义性。另外,数据注释的验证,还可以应用在 MVC 中的视图页面。

比如在 Account 类中,如果验证失败,还可以配置错误信息。这种方法会让我们的验证代码更简单,更容易维护。

「最后是 Fluent API」 ,它用于以上两种方法以外的情况,比如索引、复合键、关系都应该使用 Fluent API。

对于那些我们无法做到的配置,或者当我们想从实体类中隐藏配置时,也必须使用这种方法。

小结

这篇文章主要讲了实体属性的三种配置方式,下篇文章我们将围绕实体的数据库迁移与种子数据的填充。

更多精彩内容,请关注我▼▼

bf51c14ca76444d203a0d728ca83ef94.gif

如果喜欢我的文章,那么

在看和转发是对我最大的支持!

(戳下面蓝字阅读)

6696200da2350aa145f48f222938a600.png

推荐关注微信公众号:码侠江湖

                        69d9f4f8208410fc98f698be9886121c.png觉得不错,点个在看再走哟

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

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

相关文章

mysql innodb 索引 延迟更新_Mysql覆盖索引与延迟关联

延迟关联&#xff1a;通过使用覆盖索引查询返回需要的主键,再根据主键关联原表获得需要的数据。为什innodb的索引叶子节点存的是主键&#xff0c;而不是像myisam一样存数据的物理地址指针&#xff1f;如果存的是物理地址指针不就不需要二次查找了吗&#xff0c;根据myisam和inn…

Android之在笔记本电脑adb devices识别不了oppo A9手机(设备管理器ADB Interface里面有个黄色感叹号)

1 问题 记本电脑adb devices识别不了oppo A9手机&#xff08;设备管理器ADB Interface里面有个黄色感叹号&#xff09; 图片如下 2 分析 很明显这里是驱动问题&#xff0c;ADB Interface有感叹号提示&#xff0c;所以这里需要解决驱动问题 3 解决办法 1&#xff09;可以尝试…

《假如编程是魔法之零基础看得懂的Python入门教程 》——(六)精简魔法更强大

学习目标 了解对相似逻辑的简化编写——循环 推荐 1.《备受好评的看得懂的C语言入门教程》 目录 第一篇&#xff1a;《假如编程是魔法之零基础看得懂的Python入门教程 》——&#xff08;一&#xff09;既然你选择了这系列教程那么我就要让你听得懂 第二篇&#xff1a;《假…

Tiny模板语言(VelocityPlus)初步入门

2019独角兽企业重金招聘Python工程师标准>>> 1 关于用户手册 本文主要介绍如何在模板中使用Tiny模板语言&#xff0c;通过查阅本手册&#xff0c;可以对Tiny模板语言 TTL(Tiny Template Language)的用法有一个较全面的认识&#xff0c;并学会如何有效地使用Tiny模板…

『技术群里聊些啥』.NET 如何计算文件 MD5 哈希

前言有网友在交流群中询问&#xff0c;文件 MD5 是全部读取到内存后计算出来的&#xff0c;还是拿到流就可以计算出来了&#xff1a;原理上来说&#xff0c;MD5 需要对全部内容做运算&#xff0c;所以应该是获取所有内容后再计算的。但是&#xff0c;如果全部读取到内存后再计算…

探索发现:平台云——云的新风向

本文讲的是探索发现&#xff1a;平台云——云的新风向&#xff0c;云主机&#xff0c;自2011年火热崛起之后&#xff0c;成为IDC行业替代VPS的完美系列&#xff0c;它的成功在于其相对于VPS的压倒性优势;而平台云凭借其的便捷的操作、实时监控和可视化服务&#xff0c;让站长们…

windows下配置mysql主从复制_Windows下MySQL主从复制的配置方法

MySQL主从复制允许将来自一个数据库(主数据库)的数据复制到一个或多个数据库(从数据库)。主数据库一般是实时的业务数据写入和更新操作&#xff0c;从数据库常用的读取为主。主从复制过程&#xff1a;1、主服务器上面的任何修改都会通过自己的 I/O tread(I/O 线程)保存在二进制…

【ArcGIS风暴】全国1:100万基础地理数据库获取及ArcGIS图幅完美拼接---以甘肃省为例

在日常工作中,如第三次全国国土调查、不动产登记等,我们总需要对图斑、线状等数据进行数据分幅、图幅拼接等操作。另外,日常学习工作中,无论是制图还是进行分析,都不可避免的需要使用一些基础地理数据,像行政边界、水系、道路、居民地等等,那么,这些基础地理数据有没有…

体验 .NET MAUI RC3 ,马上就要发布RTM

前言.NET MAUI 已经传了很久了&#xff0c; 5月10日&#xff0c;微软终于跟随 VS2022 17.3 预览版 发布了MAUI的候选版本 &#xff0c;今天我们来体验一波。环境运行环境&#xff1a;.Net 6开发环境&#xff1a;VS2022 17.3 &#xff08;必须是预览3&#xff09;使用在安装了V…

WebApi的调用-3.Basic验证

webapi里的特性 /// <summary>/// Basic验证 /// </summary>/// <remarks>/// /// </remarks>public class BasicAuthorizeAttibute : AuthorizeAttribute{public override void OnAuthorization(HttpActionContext actionContext){var authori…

ats 字符集问题

2019独角兽企业重金招聘Python工程师标准>>> 架构很简单&#xff0c;nginx->ats->nginx 后端nginx有做内容替换&#xff0c;字符编码为gb2312&#xff0c;因为ats为utf8编码导致前端内容展示时进行了错误的替换&#xff0c;导致内容错乱。 如 治疗鼻窦炎---&g…

《零基础看得懂的C语言入门教程 》——(十三)socket服务端编写

一、学习目标 了解C语言的socket的概念了解C语言socket的使用方法完成C语言socket服务端 目录 C语言真的很难吗&#xff1f;那是你没看这张图&#xff0c;化整为零轻松学习C语言。 第一篇&#xff1a;&#xff08;一&#xff09;脱离学习误区 第二篇&#xff1a;&#xff0…

古董来了:1999年的物件,香港已经回归了,我都上初中了,那么你出生了吗?

受疫情的影响&#xff0c;哪都去不了&#xff0c;只能在家憋着&#xff08;为社会做贡献&#xff09;这种状态已经持续了将近两个月了。无聊至极的我&#xff0c;一天无所事事&#xff0c;只能是在家这儿瞅瞅&#xff0c;那儿看看&#xff0c;用一句诗经里面的话来形容我最合适…

.NET性能优化-为结构体数组使用StructLinq

前言本系列的主要目的是告诉大家在遇到性能问题时&#xff0c;有哪些方案可以去优化&#xff1b;并不是要求大家一开始就使用这些方案来提升性能。在之前几篇文章中&#xff0c;有很多网友就有一些非此即彼的观念&#xff0c;在实际中&#xff0c;处处都是开发效率和性能之间取…

《假如编程是魔法之零基础看得懂的Python入门教程 》——(七)我把魔法变成了积木

学习目标 了解魔法积木的使用——自定义函数了解魔法积木的结果反馈——自定义函数返回值了解魔法积木的原料传递——自定义函数传参了解魔法积木的类型分类——类与对象 推荐 1.《备受好评的看得懂的C语言入门教程》 目录 第一篇&#xff1a;《假如编程是魔法之零基础看得…

关于Activity的getReferrer():如何在Activity中获取调用者?

http://blog.csdn.net/u013553529/article/details/53856800 关于Activity的getReferrer()之一&#xff1a;如何在Activity中获取调用者&#xff1f; http://blog.csdn.net/u013553529/article/details/53882440 关于Activity的getReferrer()之二&#xff1a;调用者的包名是如何…

【遥感数字图像处理】实验:Erdas 软件的认识与使用

Erdas软件下载地址:《GISer福音来了:测绘地理信息类专业软件版本大全汇总下载!》 1.1 简介 ERDAS IMAGINE 是美国 ERDAS(Earth Resource Data Analysis System)公司开发的遥感图像处理系统,它以其先进的图像处理技术,友好、灵活的用户界面和操作方式,面向广阔应用领域…

import 别名_Python基础找茬系列09--import和from-import的引用区别

一、语法区别二、两种导包在内存上的区别一图看懂import与from-import的区别无论是使用import隐式导包还是form-import显示导包&#xff0c;整个模块都会被加载到内存中例如&#xff1a;from test import b,整个模块依旧进入内存&#xff0c;因为如果只有函数b进入内存&#xf…

设计一个限速器

限速器 (Rate Limiter) 相信大家都不会陌生&#xff0c;在网络系统中&#xff0c;限速器可以控制客户端发送流量的速度&#xff0c;比如 TCP, QUIC 等协议。而在 HTTP 的世界中&#xff0c; 限速器可以限制客户端在一段时间内发送请求的次数&#xff0c;如果超过设定的阈值&…

C语言新手的100个报错解法 已更新11个错误

学习目标 收藏文章报错可以过来查 [更新数据] 此文将会持续更新&#xff0c;收录错误信息&#xff0c;若本文没有收录记得联系我~ CSDN 1_bit 持续更新中… [发布日期&#xff1a;2020年11月16日 14:55:00] 更新&#xff1a; 暂无 C语言教程 C语言真的很难吗&#xff1f;那…