using Microsoft.EntityFrameworkCore;
namespace Data.Test;
///
/// 测试用的数据库上下文
/// 演示如何配置各种类型的实体
///
public class TestDbContext : DbContext
{
public TestDbContext(DbContextOptions options) : base(options)
{
}
// 使用基类的实体
public DbSet Products => Set();
public DbSet Categories => Set();
public DbSet Tags => Set();
// 自定义实体
public DbSet CustomProducts => Set();
public DbSet Regions => Set();
// 实现接口的实体
public DbSet Orders => Set();
public DbSet Notifications => Set();
public DbSet Customers => Set();
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
ConfigureProductEntity(modelBuilder);
ConfigureCategoryEntity(modelBuilder);
ConfigureTagEntity(modelBuilder);
ConfigureCustomProductEntity(modelBuilder);
ConfigureRegionEntity(modelBuilder);
ConfigureOrderEntity(modelBuilder);
ConfigureNotificationEntity(modelBuilder);
ConfigureCustomerEntity(modelBuilder);
}
///
/// 配置 Product 实体 (使用 AuditableEntity)
///
private void ConfigureProductEntity(ModelBuilder modelBuilder)
{
modelBuilder.Entity(entity =>
{
entity.HasKey(e => e.Id);
entity.Property(e => e.Name).IsRequired().HasMaxLength(100);
entity.Property(e => e.Price).HasPrecision(18, 2);
entity.Property(e => e.Description).HasMaxLength(500);
// 添加索引
entity.HasIndex(e => e.Name);
entity.HasIndex(e => e.IsDeleted); // 软删除字段索引(提升查询性能)
});
}
///
/// 配置 Category 实体 (使用 Entity 基类)
///
private void ConfigureCategoryEntity(ModelBuilder modelBuilder)
{
modelBuilder.Entity(entity =>
{
entity.HasKey(e => e.Id);
entity.Property(e => e.Name).IsRequired().HasMaxLength(50);
entity.Property(e => e.Description).HasMaxLength(200);
});
}
///
/// 配置 Tag 实体 (使用 EntityInt 基类,自增主键)
///
private void ConfigureTagEntity(ModelBuilder modelBuilder)
{
modelBuilder.Entity(entity =>
{
entity.HasKey(e => e.Id);
entity.Property(e => e.Id).ValueGeneratedOnAdd(); // 自增
entity.Property(e => e.Name).IsRequired().HasMaxLength(50);
entity.Property(e => e.Color).HasMaxLength(20);
});
}
///
/// 配置 CustomProduct 实体 (完全自定义)
///
private void ConfigureCustomProductEntity(ModelBuilder modelBuilder)
{
modelBuilder.Entity(entity =>
{
entity.HasKey(e => e.Id);
entity.Property(e => e.Name).IsRequired().HasMaxLength(100);
entity.Property(e => e.Price).HasPrecision(18, 2);
entity.Property(e => e.CreatedDate).IsRequired();
// 忽略计算属性
entity.Ignore(e => e.IsExpensive);
});
}
///
/// 配置 Region 实体 (字符串主键)
///
private void ConfigureRegionEntity(ModelBuilder modelBuilder)
{
modelBuilder.Entity(entity =>
{
entity.HasKey(e => e.Code); // 字符串作为主键
entity.Property(e => e.Code).HasMaxLength(10);
entity.Property(e => e.Name).IsRequired().HasMaxLength(100);
entity.Property(e => e.Description).HasMaxLength(500);
});
}
///
/// 配置 Order 实体 (实现接口但不使用基类)
///
private void ConfigureOrderEntity(ModelBuilder modelBuilder)
{
modelBuilder.Entity(entity =>
{
entity.HasKey(e => e.Id);
entity.Property(e => e.OrderNumber).IsRequired().HasMaxLength(50);
entity.Property(e => e.TotalAmount).HasPrecision(18, 2);
// 索引
entity.HasIndex(e => e.OrderNumber).IsUnique();
entity.HasIndex(e => e.IsDeleted);
});
}
///
/// 配置 Notification 实体 (只实现软删除)
///
private void ConfigureNotificationEntity(ModelBuilder modelBuilder)
{
modelBuilder.Entity(entity =>
{
entity.HasKey(e => e.Id);
entity.Property(e => e.Title).IsRequired().HasMaxLength(200);
entity.Property(e => e.Content).IsRequired();
entity.HasIndex(e => e.IsDeleted);
});
}
///
/// 配置 Customer 实体 (包含值对象)
///
private void ConfigureCustomerEntity(ModelBuilder modelBuilder)
{
modelBuilder.Entity(entity =>
{
entity.HasKey(e => e.Id);
entity.Property(e => e.Name).IsRequired().HasMaxLength(100);
entity.Property(e => e.Email).IsRequired().HasMaxLength(200);
// 配置值对象 - 方式1: 使用 OwnsOne
entity.OwnsOne(e => e.ShippingAddress, address =>
{
address.Property(a => a.Street).HasMaxLength(200);
address.Property(a => a.City).HasMaxLength(100);
address.Property(a => a.State).HasMaxLength(50);
address.Property(a => a.ZipCode).HasMaxLength(20);
address.Property(a => a.Country).HasMaxLength(50);
});
entity.OwnsOne(e => e.BillingAddress, address =>
{
address.Property(a => a.Street).HasMaxLength(200);
address.Property(a => a.City).HasMaxLength(100);
address.Property(a => a.State).HasMaxLength(50);
address.Property(a => a.ZipCode).HasMaxLength(20);
address.Property(a => a.Country).HasMaxLength(50);
});
entity.HasIndex(e => e.Email);
});
}
}