修改EntityPropertyChange中NewValue/OriginalValue的MaxValueLength
解决方案
你之前的扩展方案失效是两个核心原因:
- ABP实体历史模块内置了默认512字符的截断逻辑,截断判断不读取实体属性上的
StringLength特性 - 仅新增继承类没有替换EF上下文的实体映射,运行时持久化仍使用基类的配置,字段结构也不会更新
步骤1:修改实体历史全局长度配置
在你的项目EntityFrameworkCore层模块类的PreInitialize方法中,覆盖默认的长度限制:
public override void PreInitialize() { // 原有配置保持不变 // 将属性变更值的最大存储长度修改为你需要的数值,例如8000 Configuration.EntityHistory.MaxValueLength = 8000; }
这一步是解决512字符截断的核心:ABP的实体历史记录逻辑在赋值前,会优先读取这个配置做截断,默认值就是512。
步骤2:修改数据库字段映射
不需要额外创建继承类,直接在项目的DbContext的OnModelCreating方法中,修改原EntityPropertyChange实体的字段映射即可:
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<EntityPropertyChange>(entity => { entity.Property(p => p.NewValue) .HasColumnType("varchar(MAX)") .HasMaxLength(8000); // 数值和上一步配置的MaxValueLength保持一致 entity.Property(p => p.OriginalValue) .HasColumnType("varchar(MAX)") .HasMaxLength(8000); // 数值和上一步配置的MaxValueLength保持一致 }); // 原有配置保持不变 }
步骤3:更新数据库结构
执行EF迁移命令生成结构变更脚本,更新数据库即可:
Add-Migration Update_EntityPropertyChange_Value_Field_Length Update-Database
补充说明
你之前重写SetNewValue、SetOriginalValue方法的方案无法生效,是因为ABP在调用这两个方法之前,就已经按照全局MaxValueLength配置完成了值的截断;且没有替换EF实体映射的情况下,持久化层还是会按照基类的配置生成字段、写入数据,最终还是会触发截断。
内容的提问来源于stack exchange,提问作者devson
相关产品推荐
相关产品推荐

