[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 环境搭建
- 安装
Microsoft.EntityFrameworkCore.Relational包