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

EF Core 中手动配置表名、主键、外键、索引、关系等映射

主要有两种方式:数据注解(特性)和Fluent API。以下是详细说明和示例:

一、表名配置

指定实体对应的数据表名称。

1. 数据注解([Table] 特性)

直接在实体类上标记,指定数据库表名:

using System.ComponentModel.DataAnnotations.Schema;[Table("t_class")] // 实体 Clazz 映射到数据库表 t_class
public class Clazz
{public int Id { get; set; }public string Name { get; set; }
}

2. Fluent API(在 DbContext.OnModelCreating 中配置)

通过 

ToTable 方法指定表名:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Clazz>().ToTable("t_class"); // 实体 Clazz 映射到表 t_class
}

二、主键配置

指定实体的主键字段(支持单主键、复合主键)。

1. 数据注解([Key] 特性)

标记单个属性为主键:

public class Emp
{[Key] // 指定 Id 为主键public int EmpId { get; set; }public string Name { get; set; }
}

若需复合主键(多个属性联合作为主键),需用 Fluent API(数据注解不支持复合主键)。

2. Fluent API(HasKey 方法)

单主键:

modelBuilder.Entity<Emp>().HasKey(e => e.EmpId); // 指定 EmpId 为单主键

复合主键(多个属性):

modelBuilder.Entity<Order>().HasKey(o => new { o.OrderId, o.CustomerId }); // OrderId + CustomerId 作为复合主键

三、外键与关系配置

配置实体间的关联(一对一、一对多、多对多)。

1. 数据注解([ForeignKey] 特性)

标记导航属性对应的外键字段:

public class Emp
{public int EmpId { get; set; }public string Name { get; set; }[ForeignKey("Dept")] // 指定 Dept 导航属性对应的外键是 DeptIdpublic int DeptId { get; set; }public Dept Dept { get; set; } // 导航属性:关联到 Dept 实体
}public class Dept
{public int DeptId { get; set; }public string DeptName { get; set; }public List<Emp> Emps { get; set; } // 导航属性:一对多关联 Emp
}

2. Fluent API(HasForeignKey 方法)

modelBuilder.Entity<Emp>().HasOne(e => e.Dept) // Emp 到 Dept 的一对一/多对一关系.WithMany(d => d.Emps) // Dept 到 Emp 的一对多关系.HasForeignKey(e => e.DeptId); // 指定外键为 Emp.DeptId

四、索引配置

为查询频繁的字段创建数据库索引(提升查询性能)。

1. 数据注解([Index] 特性)

public class Emp
{public int EmpId { get; set; }[Index] // 为 Name 字段创建索引public string Name { get; set; }[Index("IX_Emp_DeptId_Name", 1)] // 复合索引:第1个字段是 DeptIdpublic int DeptId { get; set; }[Index("IX_Emp_DeptId_Name", 2)] // 复合索引:第2个字段是 Namepublic string Name { get; set; }
}

2. Fluent API(HasIndex 方法)

// 单字段索引
modelBuilder.Entity<Emp>().HasIndex(e => e.Name);// 复合索引
modelBuilder.Entity<Emp>().HasIndex(e => new { e.DeptId, e.Name }).HasName("IX_Emp_DeptId_Name"); // 自定义索引名

五、其他常用配置

1. 字段非空([Required])

public class Emp
{public int EmpId { get; set; }[Required] // 数据库中 Name 字段不允许为 NULLpublic string Name { get; set; }
}

Fluent API 方式:

modelBuilder.Entity<Emp>().Property(e => e.Name).IsRequired();

2. 字段长度([StringLength])

public class Emp
{public int EmpId { get; set; }[StringLength(50)] // Name 字段长度为 50public string Name { get; set; }
}

Fluent API 方式:

modelBuilder.Entity<Emp>().Property(e => e.Name).HasMaxLength(50);

3. 数据库生成值(自增、默认值)

public class Emp
{[Key][DatabaseGenerated(DatabaseGeneratedOption.Identity)] // 自增主键(数据库自动生成)public int EmpId { get; set; }[DatabaseGenerated(DatabaseGeneratedOption.Computed)] // 数据库计算列(如创建时间默认值)public DateTime CreateTime { get; set; }
}

Fluent API 方式:

modelBuilder.Entity<Emp>().Property(e => e.EmpId).ValueGeneratedOnAdd(); // 自增(等价于 Identity)modelBuilder.Entity<Emp>().Property(e => e.CreateTime).HasDefaultValueSql("GETDATE()"); // 默认值为数据库当前时间

六、总结

配置类型

数据注解(特性)

Fluent API(示例)

表名

[Table("t_class")]

Entity().ToTable("t_class")

主键

[Key]

Entity().HasKey(e => e.EmpId)

外键

[ForeignKey("Dept")]

Entity().HasOne(e => e.Dept).WithMany().HasForeignKey(e => e.DeptId)

索引

[Index]

Entity().HasIndex(e => e.Name)

非空

[Required]

Entity().Property(e => e.Name).IsRequired()

长度

[StringLength(50)]

Entity().Property(e => e.Name).HasMaxLength(50)

自增 / 默认值

[DatabaseGenerated(...)]

Entity().Property(e => e.EmpId).ValueGeneratedOnAdd()

通过数据注解(简单直观,适合单实体配置)或Fluent API(灵活强大,适合复杂关系 / 全局配置),可以精准控制 EF Core 与数据库的映射逻辑,适配各种业务场景~

http://www.dtcms.com/a/561601.html

相关文章:

  • 做洁净的网站怎么利用源码做网站
  • 《高性能MySQL》第6讲:查询性能优化
  • 东台建设网站的公司天津建筑工程信息平台
  • “自然搞懂”深度学习(基于Pytorch架构)——010203
  • GitHub上Transformers项目中推理函数pipeline的使用
  • 笔记本电脑都挺好,但为啥总是卡顿?如何释放笔记本性能?
  • 邯郸有建网站的吗企业管理咨询是做什么的
  • 网站的页头页脚怎么做贵阳网站建设推广公司
  • 【Java Stream 和 Collection 的真正区别】
  • 数据开发到数据中台又到数据治理
  • 网站 网页区别是什么淘宝网站建设素材
  • ubuntu系统找不懂nvidia-smi,更新驱动更没有,找不到网卡,很难,但是解决了,睡一觉我的ubuntu系统坏了(推荐二)
  • 曲阜市古建设计院网站阜宁网页设计
  • 从零到一:打造现代化全栈个人博客系统
  • Windows 安装 WSL 并集成 Docker
  • LVS-DR模式配置
  • 零基础新手小白快速了解掌握服务集群与自动化运维(十六)集群部署模块——LVS-DRTUN模式配置
  • 济南网站建设网站最新域名解析网站
  • LVS-NAT、DR、TUN模式配置
  • Qt样式深度解析
  • 怎么用自己电脑做网站优化一个网站
  • 莱芜做网站优化溧阳建设集团有限公司网站
  • id创建网站徐州品牌网站建设
  • 创意设计app青岛网站seo技巧
  • 中英文网站建设 大概要多久张掖建设网站
  • python 异步编程 -- 理解concurrent.futures.Future 对象
  • 【网络工程师】物理二层STP协议
  • 网站关键词排名优化应该怎么做网站备案成功后怎么办
  • Vue3组件间通信——pinia
  • php零基础做网站网站没后台怎么修改类容