【Entity Framework】EF中实体属性

【Entity Framework】EF中实体属性

文章目录

  • 【Entity Framework】EF中实体属性
    • 一、概述
    • 二、已包含和已排除的属性
    • 三、别名
    • 四、列数据类型
    • 五、最大长度
    • 五、精度和小数位数
    • 六、Unicode
    • 六、必需和可选属性
    • 七、列排序规则
    • 八、列注释
    • 九、列排序

一、概述

模型中的每个实体类型都有一组属性,EF Core将从数据库中读取和写入这些属性。如果使用的是关系数据库,实体属性将映射到表列。

二、已包含和已排除的属性

按照约定,所有具有GetterSetter的公共属性都将包含在模型中。

  • 排除特定属性
public class Blog
{public int BlogId { get; set; }public string Url { get; set; }[NotMapped]public DateTime LoadedFromDatabase { get; set; }
}
  • 排除Fluent API
protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Blog>().Ignore(b => b.LoadedFromDatabase);
}

三、别名

按照约定,使用关系数据库时,实体属性将映射到与属性同名的表列。如果希望配置具有不同名称的列,可以按以下代码片段进行操作:

  • 别名属性
public class Blog
{[Column("blog_id")]public int BlogId { get; set; }public string Url { get; set; }
}
  • 别名Fluent API
protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Blog>().Property(b => b.BlogId).HasColumnName("blog_id");
}

四、列数据类型

使用关系数据库时,数据库提供程序会根据属性的 .NET 类型选择数据类型。 它还会考虑其他元数据。例如配置的最大度,属性是否主键的一部分等等。

如,SQL ServerDateTime属性映射到datetime2(7)列,将string属性映射到nvarchar(max)列(或对于用作键的属性,映射到nvarchar(450))。

还可以配置列以指定列的确切数据类型。 例如,以下代码将 Url 配置为非 unicode 字符串,其最大长度为 200,并将 Rating 配置为十进制,其精度为 5,小数位数为 2

  • 列数据类型属性
public class Blog
{public int BlogId { get; set; }[Column(TypeName = "varchar(200)")]public string Url { get; set; }[Column(TypeName = "decimal(5, 2)")]public decimal Rating { get; set; }
}
  • 列数据类型Fluent API
protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Blog>(eb =>{eb.Property(b => b.Url).HasColumnType("varchar(200)");eb.Property(b => b.Rating).HasColumnType("decimal(5, 2)");});
}

五、最大长度

配置最大长度可向数据库提供程序提供有关为给定属性选择适当列数据类型的提示。 最大长度仅适用于数组数据类型,如 stringbyte[]

  • 最大长度属性
public class Blog
{public int BlogId { get; set; }[MaxLength(500)]public string Url { get; set; }
}
  • 最大长度Fluent API
protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Blog>().Property(b => b.Url).HasMaxLength(500);
}

在向提供程序传递数据之前,实体框架不会执行任何最大长度的验证。而是由提供程序或数据存储根据情况进行验证。 例如,当面向 SQL Server 时,超过最大长度将导致异常,因为基础列的数据类型不允许存储多余的数据。

五、精度和小数位数

某些关系数据类型支持精度和小数位数 Facet,它们用于控制可以存储哪些值,以及列需要多少存储。 哪些数据类型支持精度和小数位数取决于数据库,但在大多数数据库中,decimalDateTime 类型支持这些 Facet。 对于 decimal 属性,精度用于定义表示列将包含的任何值所需的最大位数,小数位数用于定义所需的最大小数位数。 对于 DateTime 属性,精度用于定义表示秒的小数部分所需的最大位数,不使用小数位数。

在以下示例中,将 Score 属性配置为精度为 14 和小数位数为 2 将导致在 SQL Server 上创建 decimal(14,2) 类型的列,将 LastUpdated 属性配置为精度为 3 将导致创建 datetime2(3) 类型的列:

  • 属性
public class Blog
{public int BlogId { get; set; }[Precision(14, 2)]public decimal Score { get; set; }[Precision(3)]public DateTime LastUpdated { get; set; }
}
  • Fluent API
protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Blog>().Property(b => b.Score).HasPrecision(14, 2);modelBuilder.Entity<Blog>().Property(b => b.LastUpdated).HasPrecision(3);
}

六、Unicode

在某些关系数据库中,存在不同的类型来表示Unicode和非Unicode文本数据。例如:在SQL Server中,nvarchar(x)用于表示UTF-16格式的Unicode数据,而varchar(x)用于表示非Unicode数据。对于不支持此概念的数据库,配置此概念将不起作用。

默认情况下,文本属性配置为Unicode。可以将列配置为非Unicode,如下所示:

  • 属性
public class Book
{public int Id { get; set; }public string Title { get; set; }[Unicode(false)][MaxLength(22)]public string Isbn { get; set; }
}
  • Fluent API
protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Book>().Property(b => b.Isbn).IsUnicode(false);
}

六、必需和可选属性

如果属性包含 null 是有效的,则该属性被视为可选属性。 如果 null 不是要分配给属性的有效值,则它被视为必需属性。 映射到关系数据库架构时,必需属性创建为不可为 null 的列,可选属性创建为可为 null 的列。

  • 属性
public class Blog
{public int BlogId { get; set; }[Required]public string Url { get; set; }
}
  • Fluent API
protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Blog>().Property(b => b.Url).IsRequired();
}

七、列排序规则

可以定义文本列的排序规则,以确定如何比较和排序。

modelBuilder.Entity<Customer>().Property(c => c.Name).UseCollation("SQL_Latin1_General_CP1_CI_AS");

如果数据库中的所有列都需要使用特定的排序规则,请改为在数据库级别定义排序规则。

八、列注释

可以对数据库列设置任意文本注释,从而在数据库中记录架构:

  • 属性
public class Blog
{public int BlogId { get; set; }[Comment("The URL of the blog")]public string Url { get; set; }
}
  • Fluent API
protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Blog>().Property(b => b.Url).HasComment("The URL of the blog");
}

九、列排序

默认情况下,在使用迁移建表时,EF Core 首先为主键列排序,然后为实体类型和从属类型的属性排序,最后为基类型中的属性排序。 但是,你可以指定不同的列顺序:

  • 属性
public class EntityBase
{[Column(Order = 0)]public int Id { get; set; }
}public class PersonBase : EntityBase
{[Column(Order = 1)]public string FirstName { get; set; }[Column(Order = 2)]public string LastName { get; set; }
}public class Employee : PersonBase
{public string Department { get; set; }public decimal AnnualSalary { get; set; }
}
  • Fluent API
protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Employee>(x =>{x.Property(b => b.Id).HasColumnOrder(0);x.Property(b => b.FirstName).HasColumnOrder(1);x.Property(b => b.LastName).HasColumnOrder(2);});
}

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

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

相关文章

面试题:Java虚拟机JVM的组成

1. 基础概念 JVM是什么 Java Virtual Machine Java程序的运行环境&#xff08;java二进制字节码的运行环境&#xff09; 好处&#xff1a; 一次编写&#xff0c;到处运行 自动内存管理&#xff0c;垃圾回收机制 JVM由哪些部分组成&#xff0c;运行流程是什么&#xff1f; …

【aws】什么是assume role

从什么是account&#xff08;账户&#xff09;user&#xff08;用户&#xff09;role&#xff08;角色&#xff09;说起 aws提供的云服务要通过订阅的方式租用并且计费。而aws账户就是所有订阅&#xff0c;计费&#xff0c;云服务的一个独立空间&#xff0c;在这个空间中的所有…

C++从入门到精通——C++输入和输出

C输入和输出 前言一、C打印Hello World二、C输入&输出关于I/O流C输入&输出cout函数cin函数endl函数 三、C输入和输出的说明printf、scanf和cout、cin的区别cout函数和cin函数控制精度和宽度std命名空间的使用惯例 前言 C中的输入和输出主要通过标准库中的iostream类实…

Linux 入门及其基本指令(上)

目录 0 .引言 1. XShell 远程登录 Linux 1.1 云服务器 1.2. XShell 远程登陆 Linux 2. 详解 Linux 基本指令 2.1 ls 指令 2.2 pwd 指令 2.3 cd 指令 2.4 touch 指令 2.5 mkdir指令 2.6 rmdir指令 && rm 指令 0 .引言 如今&#xff0c;Linux 在服务器…

uniapp vue-cli项目配置devServer和outPutDir

上一次说了使用vue-cli创建uni-app项目&#xff0c;然后使用第三方工具开发打包&#xff0c;利用jekins发布等。 这一次我想解决以下问题&#xff1a; 1我想配置devServer供开发环境使用&#xff0c;这样也可以解决开发环境的跨域问题 2以前我的每个版本信息都配置在package…

黑群晖基于docker配置frp内网穿透

前言 我的黑群晖需要设置一下内网穿透来外地访问&#xff0c;虽然zerotier的p2p组网已经很不错了&#xff0c;但是这个毕竟有一定的局限性&#xff0c;比如我是ios的国区id就下载不了zerotier的app&#xff0c;组网不了 1.下载镜像 选择第一个镜像 2.映射文件 配置frpc.ini&a…

C 指向指针的指针

指向指针的指针是一种多级间接寻址的形式&#xff0c;或者说是一个指针链。通常&#xff0c;一个指针包含一个变量的地址。当我们定义一个指向指针的指针时&#xff0c;第一个指针包含了第二个指针的地址&#xff0c;第二个指针指向包含实际值的位置。 一个指向指针的指针变量…

常见6种开源协议比较

前言 常见的开源许可协议有6种是比较常见和广泛使用的&#xff0c;每种协议都有其特定的使用场景和约束条件。这6种分别是GPL, LGPL&#xff0c;MIT许可证&#xff0c; Apache许可证&#xff0c;BSD许可证和Mozilla Public License&#xff08;MPL&#xff09;. 6种开源许可协议…

Linux的Shell基础知识总结

Shell 简介 图形界面和命令行的目的一样&#xff0c;都是让用户控制计算机。真正控制计算机硬件&#xff08;CPU、内存、显示器等&#xff09;的只有操作系统内核&#xff08;Kernel&#xff09;。图形界面和命令行只是架设在用户和内核之间的一座桥梁。Shell 是一个应用程序&…

Redis 开源协议变更背后:开源软件与云计算巨头的竞争博弈

01 背景 在云计算的风潮下&#xff0c;开源软件的生态环境正在经历一场剧变。2024 年 3 月 20 日&#xff0c;这种变化在 Redis 身上得到了集中体现。Redis 商业公司 CEO Rowan Trollope 宣布&#xff0c;Redis 将从 BSD 3-Clause 许可证过渡到双重许可证模式&#xff0c;包括…

【Redis】Redisson实现分布式锁

Redisson是一个在Redis的基础上实现的Java驻内存数据网格&#xff08;In-Memory Data Grid&#xff09;。它不仅提供了一系列的分布式的Java常用对象&#xff0c;还提供了许多分布式服务&#xff0c;其中就包含了各种分布式锁的实现。 官网地址 GitHub地址 Redisson入门 1.引…

Nexus3 Docker 私有仓库

Nexus3 Docker 私有仓库 安装并部署 Nexus3 $ docker search nexus3$ docker pull sonatype/nexus3$ mkdir /home/tester/data/docker/nexus3/sonatype-work $ sudo chown -R 200 /home/tester/data/docker/nexus3/sonatype-work$ docker run -d --namenexus3 \ --restartalw…

【P1518】[USACO2.4] 两只塔姆沃斯牛 The Tamworth Two

[USACO2.4] 两只塔姆沃斯牛 The Tamworth Two 题目描述 两只牛逃跑到了森林里。Farmer John 开始用他的专家技术追捕这两头牛。你的任务是模拟他们的行为&#xff08;牛和 John&#xff09;。 追击在 10 10 10 \times 10 1010 的平面网格内进行。一个格子可以是&#xff1…

面试题目--3.19

1.foo()和foo()之间有什么区别&#xff1f; 代表所有的warning忽略 2.什么是csrf攻击&#xff1f;如何防范&#xff1f; csrf&#xff0c;跨站请求伪造&#xff0c;攻击方伪装用户身份发送请求从而窃取信息或者破坏系统。 基本原理&#xff1a;用户访问a网站登录并生成了coo…

亲历中国智驾大战,吴新宙加入NVIDIA半年后首秀

‍作者 |张祥威 编辑 |德新 吴新宙近日现身NVIDIA GTC&#xff0c;这是其从小鹏汽车离开加入NVIDIA之后的首次公开亮相。 吴目前担任NVIDIA汽车事业部副总裁&#xff0c;全面负责NVIDIA的车载计算产品线DRIVE平台的产品定义以及工程落地工作。吴新宙最广为人知的经历&#xf…

3.28C++

复数类的实现&#xff0c;写出三种构造函数&#xff0c;算术运算符、关系运算符、逻辑运算符重载尝试实现自增、自减运算符的重载 #include <iostream> using namespace std; class Num {int rel; //实部int vir; //虚部 public:Num():rel(2),vir(1){}Num(int rel,…

深入解析RSA算法原理及其安全性机制

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 目录 一、RSA算法简介二、RSA算法原理2.1 背景与数学基础2.2 密钥生成2.3 加密过程2.4 解密过程 三、安全性考虑四、RSA的使用五、…

数据结构进阶篇 之 【二叉树链序存储】的整体实现讲解

封建迷信我嗤之以鼻&#xff0c;财神殿前我长跪不起 一、二叉树链式结构的实现 1.二叉树的创建 1.1 手动创建 1.2 前序递归创建 2.二叉树的遍历 2.1 前序&#xff0c;中序以及后序遍历概念 2.2 层序遍历概念 2.3 前序打印实现 2.4 中序打印实现 2.4 后序打印实现 2.…

SpringBoot项目启动成功,但是调用接口直接报NOT FOUND 404

问题描述 SpringBoot项目启动成功&#xff0c;但是调用接口直接报NOT FOUND 404 解决办法 启动类中ComponentScan(basePackages {“com.afclab”})中的扫包路径和项目路径不一样&#xff0c;导致扫不到Controller等组件&#xff0c;修改成和项目路径一样就可以解决&#xf…

MYSQL高阶语句(一)

目录 一、常用查询 1、order by 按关键字排序 1.升序排序 2.降序排序 3.结合where进行条件过滤再排序 4.多字段排序 2、区间判断及查询不重复记录 1. and / or 且与或的使用 2.嵌套、多条件使用 3.distinct 查询不重复记录 3、GROUP BY 对结果进行分组 4、Li…