在 Entity Framework Core(EF Core)中,有多种配置实体与数据库表之间映射关系的方式,下面为你详细介绍:
数据注解是一种简单直接的配置方式,通过在实体类的属性上添加特性(Attribute)来指定映射规则。这种方式将映射信息直接嵌入到实体类代码中,使用起来较为便捷。
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
// 实体类
public class Book
{
// 指定主键
[Key]
public int Id { get; set; }
// 指定列名和最大长度
[Column("BookTitle")]
[MaxLength(200)]
public string Title { get; set; }
// 指定该属性不映射到数据库列
[NotMapped]
public string DisplayTitle => $"Book: {Title}";
}
[Key] 特性:用于指定实体类中的主键属性。
[Column] 特性:可以指定数据库表中列的名称、数据类型等信息。
[MaxLength] 特性:用于限制属性值的最大长度。
[NotMapped] 特性:表示该属性不会映射到数据库表的列,通常用于一些计算属性。
流畅 API 是一种更强大、更灵活的配置方式,通过重写 DbContext 类中的 OnModelCreating 方法,使用 ModelBuilder 对象来配置实体与数据库表的映射关系。这种方式可以将映射配置与实体类代码分离,使代码结构更清晰。
using Microsoft.EntityFrameworkCore;
// 数据库上下文类
public class LibraryContext : DbContext
{
public DbSet<Book> Books { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// 配置 Book 实体
modelBuilder.Entity<Book>()
.HasKey(b => b.Id);
modelBuilder.Entity<Book>()
.Property(b => b.Title)
.HasColumnName("BookTitle")
.HasMaxLength(200);
modelBuilder.Entity<Book>()
.Ignore(b => b.DisplayTitle);
}
}
// 实体类
public class Book
{
public int Id { get; set; }
public string Title { get; set; }
public string DisplayTitle => $"Book: {Title}";
}
HasKey 方法:指定实体类的主键属性。
Property 方法:用于配置实体类的属性,如 HasColumnName 方法指定列名,HasMaxLength 方法指定最大长度。
Ignore 方法:表示忽略该属性,不将其映射到数据库表的列。
EF Core 有一些默认的约定规则,会根据实体类的属性名和类型自动进行映射。例如,名为 Id 或 {实体类名}Id 的属性会被默认视为主键。这种方式适用于简单的映射场景,可以减少配置代码。
using Microsoft.EntityFrameworkCore;
// 数据库上下文类
public class LibraryContext : DbContext
{
public DbSet<Book> Books { get; set; }
}
// 实体类
public class Book
{
public int Id { get; set; }
public string Title { get; set; }
}
在这个示例中,Id 属性会被 EF Core 自动识别为主键,Title 属性会被映射到数据库表中同名的列。
- 数据注解:简单直接,适合快速配置基本的映射关系,但会使实体类代码中混入映射信息,不利于代码的维护和扩展。
- 流畅 API:功能强大、灵活,可将映射配置与实体类代码分离,适合复杂的映射场景和大型项目。
- 约定配置:无需额外配置,适用于简单的映射场景,但对于不符合约定的情况,需要使用数据注解或流畅 API 进行调整。
在实际开发中,通常会结合使用这三种方式,根据具体需求选择最合适的配置方法。