Skip to content

[TOC]

EF CORE 的使用

EF Core 环境搭建

1.安装

  安装 NuGet 包 Microsoft.EntityFrameworkCore.SqlServer

2. 创建实体类

C
    public class User
    {
        public int Id { get; set; }
        public string Name { get; set; }
        //public string Email { get; set; }
        //public string Phone { get; set; }
        public string Password { get; set; }

    }

3.建立相关配置(以下二选一)

3.1. Data Annotation(数据注释)配置实体类,

注释相关说明请看EF CORE常用Data Annotation(数据注解 数据特性),例如

C

    [Table("User")]
    public class User
    {
        [Key]
        public int Id { get; set; }

        [MaxLength(20)] 
        [Required]
        public string Name { get; set; }
        //public string Email { get; set; }
        //public string Phone { get; set; }
        [MaxLength(20)]
        public string Password { get; set; }

    }

3.2. Fluent API 配置实体类创建实体类对应的配置类,

点击查看相关函数说明以及案例例如

C

using Microsoft.EntityFrameworkCore;
using MyApp.Models;

namespace MyApp.Contexts;

public class AppDbContext : DbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }

    public DbSet<User> Users => Set<User>();
    public DbSet<Role> Roles => Set<Role>();
    public DbSet<UserRole> UserRoles => Set<UserRole>();
    public DbSet<Order> Orders => Set<Order>();

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // ===== User 配置 =====
        modelBuilder.Entity<User>(entity =>
        {
            entity.ToTable("Sys_User");
            entity.HasKey(u => u.Id);
            entity.Property(u => u.Id).HasColumnType("bigint").ValueGeneratedNever();

            entity.Property(u => u.UserName)
                  .IsRequired()
                  .HasMaxLength(50);

            entity.Property(u => u.Email)
                  .IsRequired()
                  .HasMaxLength(100);

            entity.Property(u => u.CreatedAt)
                  .HasColumnType("datetime2")
                  .HasDefaultValueSql("GETUTCDATE()");

            entity.HasIndex(u => u.Email).IsUnique();

            // 软删除全局过滤器(这里先在实体上加,也可以放外面)
            entity.HasQueryFilter(u => !u.IsDeleted);
        });

        // ===== Role 配置 =====
        modelBuilder.Entity<Role>(entity =>
        {
            entity.ToTable("Sys_Role");
            entity.HasKey(r => r.Id);
            entity.Property(r => r.Id).HasColumnType("bigint").ValueGeneratedNever();
            entity.Property(r => r.Name).IsRequired().HasMaxLength(30);
        });

        // ===== UserRole 中间表配置 =====
        modelBuilder.Entity<UserRole>(entity =>
        {
            entity.ToTable("Sys_User_Role");
            entity.HasKey(ur => ur.Id); // 中间表有自己的主键
            entity.Property(ur => ur.Id).HasColumnType("bigint").ValueGeneratedNever();

            entity.Property(ur => ur.UserId).HasColumnType("bigint");
            entity.Property(ur => ur.RoleId).HasColumnType("bigint");
            entity.Property(ur => ur.AssignedAt)
                  .HasColumnType("datetime2")
                  .HasDefaultValueSql("GETUTCDATE()");

            // 关系配置
            entity.HasOne(ur => ur.User)
                  .WithMany(u => u.UserRoles)
                  .HasForeignKey(ur => ur.UserId)
                  .OnDelete(DeleteBehavior.Cascade);

            entity.HasOne(ur => ur.Role)
                  .WithMany(r => r.UserRoles)
                  .HasForeignKey(ur => ur.RoleId)
                  .OnDelete(DeleteBehavior.Cascade);
        });

        // ===== Order 配置(一对多)=====
        modelBuilder.Entity<Order>(entity =>
        {
            entity.ToTable("Orders");
            entity.HasKey(o => o.Id);
            entity.Property(o => o.Id).HasColumnType("bigint").ValueGeneratedNever();
            entity.Property(o => o.UserId).HasColumnType("bigint");
            entity.Property(o => o.ProductName).IsRequired().HasMaxLength(100);
            entity.Property(o => o.Amount).HasColumnType("decimal(18,2)");

            // 配置外键关系
            entity.HasOne(o => o.User)
                  .WithMany(u => u.Orders)
                  .HasForeignKey(o => o.UserId)
                  .OnDelete(DeleteBehavior.Restrict); // 防止误删用户时删订单
        });

        // ===== 种子数据 =====
        modelBuilder.Entity<Role>().HasData(
            new Role { Id = 1, Name = "Admin" },
            new Role { Id = 2, Name = "User" }
        );

        modelBuilder.Entity<User>().HasData(
            new User { Id = 1001, UserName = "admin", Email = "admin@example.com", IsDeleted = false }
        );

        modelBuilder.Entity<UserRole>().HasData(
            new UserRole { Id = 1, UserId = 1001, RoleId = 1, AssignedAt = DateTime.UtcNow }
        );
    }
}

或者

C
using Microsoft.EntityFrameworkCore;
using WebApplication1.Entity;
using Microsoft.EntityFrameworkCore.Metadata.Builders;

namespace WebAppliction1.Entity.Configuration
{
    public class UserConfiguration : IEntityTypeConfiguration<User>//要继承IEntityTypeConfiguration 这个类
    {
        ///
        /// 要实现这个方法
        /// 
        public void Configure(EntityTypeBuilder<User> builder)
        {
            builder.ToTable("User");
            builder.Property(e => e.Id).IsRequired(); 
        }
    } 
}

迁移

就是根据实体类和相关配置,自动生成数据库表

1.安装 Microsoft.EntityFrameworkCore.Tools 包

EF Core 和 .net core 环境搭建

  1. 安装 Microsoft.EntityFrameworkCore.Relational