使用EF Core的MaxLength数据注解在提交前筛选超出字段长度的行
EF Core提交前基于MaxLength数据注解筛选超长度行的实现方案
首先纠正之前的用法问题:[MaxLength]特性需要标注在实体类的对应属性上,而非DbContext中,标注示例如下:
public class 你的实体类名 { public int Id { get; set; } // 示例:限制当前字段最长为6个字符 [MaxLength(6, ErrorMessage = "字段长度超出限制")] public string 要限制长度的字段名 { get; set; } // 其余字段 }
标注完成后可以通过以下两种方案在数据提交前生成超出限制的行集合:
方案1:基于EF Core内置校验实现(适用于实体已加入DbContext的场景)
无需调用SaveChanges,直接通过变更跟踪器批量校验所有新增实体:
// 存储所有校验不通过的行 var invalidRows = new List<object>(); // 遍历所有待新增的实体 foreach (var entry in dbContext.ChangeTracker.Entries() .Where(e => e.State == EntityState.Added)) { var validationContext = new ValidationContext(entry.Entity); var validationResults = new List<ValidationResult>(); // 校验所有数据注解规则,包含MaxLength限制 bool isValid = Validator.TryValidateObject( instance: entry.Entity, validationContext: validationContext, validationResults: validationResults, validateAllProperties: true); if (!isValid) { invalidRows.Add(entry.Entity); // 可在此处扩展记录具体是哪个字段超出长度、超出多少等信息 } }
方案2:手动反射校验(适用于实体尚未加入DbContext的批量导入场景,性能更高)
如果仅需要校验MaxLength规则、不需要校验其他数据注解,可以提前缓存字段长度规则后批量判断:
// 示例:待校验的实体列表是从JSON解析得到的List<YourEntity> var invalidRows = new List<YourEntity>(); // 提前缓存实体所有带MaxLength特性的属性和对应长度限制,避免重复反射 var maxLengthRules = typeof(YourEntity) .GetProperties() .Where(p => p.IsDefined(typeof(MaxLengthAttribute), inherit: false)) .ToDictionary( prop => prop, prop => prop.GetCustomAttribute<MaxLengthAttribute>().Length); // 遍历所有导入的行逐个校验 foreach (var row in yourEntityListFromJson) { bool isOverLength = false; foreach (var (prop, maxLen) in maxLengthRules) { if (prop.GetValue(row) is string strVal && strVal.Length > maxLen) { isOverLength = true; break; } } if (isOverLength) { invalidRows.Add(row); } }
内容的提问来源于stack exchange,提问作者Jason_Hough
相关产品推荐
相关产品推荐

