代码改变世界

EFCore有几种配置映射方式

2025-03-25 16:05  钟铧若岩  阅读(108)  评论(0)    收藏  举报
在 Entity Framework Core(EF Core)中,有多种配置实体与数据库表之间映射关系的方式,下面为你详细介绍:

1. 数据注解(Data Annotations)

数据注解是一种简单直接的配置方式,通过在实体类的属性上添加特性(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] 特性:表示该属性不会映射到数据库表的列,通常用于一些计算属性。

2. 流畅 API(Fluent API)

流畅 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 方法:表示忽略该属性,不将其映射到数据库表的列。

3. 约定配置(Convention-based Configuration)

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 进行调整。

 

在实际开发中,通常会结合使用这三种方式,根据具体需求选择最合适的配置方法。