模型种子数据的局限性:
用于测试的临时数据
依赖于数据库状态的数据
大数据(在迁移快照中捕获播种数据,大数据会迅速导致大文件和性能下降)。
需要由数据库生成键值的数据,包括使用备用键作为身份的实体
需要自定义转换的数据(不由值转换处理),例如一些密码散列
需要调用外部 API 的数据,例如 ASP.NET Core 身份角色和用户创建
我收到“无法添加实体类型'角色'的种子实体,因为属性'Id'需要一个非零值。考虑提供一个负值以避免与非种子数据发生冲突”播种 asp.net 身份时的错误Role,所以我们应该设置 Id 值:
namespace Attendance.Server.Data.Configs;
public class RoleConfig : IEntityTypeConfiguration<Role>
{
public void Configure(EntityTypeBuilder<Role> builder)
{
builder.ToTable("Role");
builder.Property(p => p.Name).IsUnicode(false).HasMaxLength(50).IsRequired();
builder.Property(p => p.NormalizedName).IsUnicode(false).HasMaxLength(50).IsRequired();
builder.Property(p => p.ConcurrencyStamp).IsUnicode(false);
// seed
builder.HasData(
new Role { Id = 1, Name = "admin", NormalizedName = "ADMIN" },
new Role { Id = 2, Name = "user", NormalizedName = "USER" }
);
}
}
我的角色实体:
using Microsoft.AspNetCore.Identity;
namespace Attendance.Server.Data.Entities;
public partial class Role : IdentityRole<int>
{
}
使用 DbContext 中的ApplyConfigurationsFromAssembly方法仅通过一行代码添加所有配置类:
namespace Attendance.Server.Data;
public class AppDbContext : IdentityDbContext<User, Role, int, UserClaim, UserRole, UserLogin, RoleClaim, UserToken>, IUnitOfWork
{
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
public Task<int> SaveChangesAsync()
{
return base.SaveChangesAsync();
}
public void MarkAsDeleted<TEntity>(TEntity entity) => base.Entry(entity).State = EntityState.Deleted;
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ApplyConfigurationsFromAssembly(typeof(UserConfig).Assembly);
}
}