当前位置: 首页 > news >正文

.NET Core FluentAPI

目录

约定配置

主要规则 

两种配置方式

Data Annotation

Fluent API

Fluent API配置

Fluent API众多方法

选择


约定配置

主要规则 

  1. 表名采用DbContext中的对应的DbSet的属性名。
  2. 数据表列的名字采用实体类属性的名字,列的数据类型采用和实体类属性类型最兼容的类型。
  3. 数据表列的可空性取决于对应实体类属性的可空性。
  4. 名字为Id的属性为主键,如果主键为short, int 或者 long类型,则默认采用自增字段,如果主键为Guid类型,则默认采用默认的Guid生成机制生成主键值。

两种配置方式

Data Annotation

把配置以特性(Annotation)的形式标注在实体类中。

优点:简单;缺点:耦合。

[Table("T_Books")]
public class Book
{
}
Fluent API

把配置写到单独的配置类中。
缺点:复杂;优点:解耦。

builder.ToTable("T_Books");
Fluent API配置
  1. 视图与实体类映射:
    modelBuilder.Entity<Blog>().ToView("blogsView");
  2. 排除属性映射:
    modelBuilder.Entity<Blog>().Ignore(b => b. Name2);
  3. 配置列名:
    modelBuilder.Entity<Blog>().Property(b=>b.BlogId).HasColumnName("blog_id");
  4. 配置列数据类型:
    builder.Property(e => e.Title) .HasColumnType("varchar(200)")
  5. 配置主键:
    默认把名字为Id或者“实体类型+Id“的属性作为主键,可以用HasKey()来配置其他属性作为主键。modelBuilder.Entity<Student>().HasKey(c => c.Number);支持复合主键,但是不建议使用。
  6. 生成列的值:
    modelBuilder.Entity<Student>().Property(b => b.Number).ValueGeneratedOnAdd();
  7. 设置默认值:
    modelBuilder.Entity<Student>().Property(b => b.Age).HasDefaultValue(6);
  8. 索引:
    modelBuilder.Entity<Blog>().HasIndex(b => b.Url);
  9. 复合索引:
    modelBuilder.Entity<Person>().HasIndex(p => new { p.FirstName, p.LastName });
  10. 唯一索引:IsUnique();聚集索引:IsClustered()
  11. 用EF Core太多高级特性的时候谨慎,尽量不要和业务逻辑混合在一起,以免“不能自拔”。比如Ignore、Shadow、Table Splitting等……
Fluent API众多方法

Fluent API中很多方法都有多个重载方法。比如HasIndex、Property()。
把Number属性定义为索引,下面两种方法都可以:

builder.HasIndex("Number");
builder.HasIndex(b=>b.Number);

推荐使用HasIndex(b=>b.Number)、Property(b => b.Number)这样的写法,因为这样利用的是C#的强类型检查机制

选择
  1.  Data Annotation 、Fluent API大部分功能重叠。可以混用,但是不建议混用。
  2. 有人建议混用,即用了Data Annotation 的简单,又用到Fluent API的强大,而且实体类上标注的[MaxLength(50)]、[Required]等标注可以被ASP.NET Core中的验证框架等复用。
http://www.lryc.cn/news/516775.html

相关文章:

  • 【C++数据结构——查找】顺序查找(头歌实践教学平台习题)【合集】
  • HTTP Scheme 通常指的是在 URL 中用于指定使用 HTTP 协议的方案(scheme)
  • 基于Matlab的变压器仿真模型建模方法(13):单相升压自耦变压器的等效电路和仿真模型
  • 【Vue.js】监听器功能(EventListener)的实际应用【合集】
  • 【Shell脚本】Docker构建Java项目,并自动停止原镜像容器,发布新版本
  • 【iOS Swift Moya 最新请求网络框架封装通用】
  • 前端批量下载文件
  • 【pytorch-lightning】架构一览
  • MongoDB相关使用问题
  • DevSecOps自动化在安全关键型软件开发中的实践、Helix QAC Klocwork等SAST工具应用
  • 常见的显示器分辨率及其对应的像素数量
  • TDengine + MQTT :车联网时序数据库如何高效接入
  • maven的中国镜像有哪些
  • ModelScope ms-swift:轻量级模型微调框架
  • 深度解析与实践:HTTP 协议
  • Zookeeper是如何解决脑裂问题的?
  • 《Opencv》基础操作详解(5)
  • AI大模型-提示工程学习笔记2
  • AWS ELB基础知识
  • 我用Ai学Android Jetpack Compose之Text
  • Robot---奇思妙想轮足机器人
  • springcloud 介绍
  • 【STM32】I2C为什么要开漏输出和上拉电阻
  • 【从零开始入门unity游戏开发之——C#篇44】C#补充知识——var隐式类型、初始化器、匿名类型
  • Spring Boot 中 TypeExcludeFilter 的作用及使用示例
  • 解锁kafka组件安全性解决方案:打造全方位安全防线
  • 【C++数据结构——图】最小生成树(头歌实践教学平台习题) 【合集】
  • Java(1)入门基础
  • 2024.1.5总结
  • 【C语言程序设计——循环程序设计】枚举法换硬币(头歌实践教学平台习题)【合集】