swd*_*don 3 c# model-validation asp.net-core-webapi ef-core-2.1
我有一个DbContext像这样的基类
public abstract class DbContextBase : DbContext
{
public DbContextBase()
{
}
public DbContextBase(DbContextOptions options)
: base(options)
{
}
public override int SaveChanges()
{
this.ValidateEntities();
return base.SaveChanges();
}
public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken))
{
this.ValidateEntities();
return base.SaveChangesAsync(cancellationToken);
}
public override Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default(CancellationToken))
{
this.ValidateEntities();
return base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);
}
protected virtual void ValidateEntities()
{
var entities = this.ChangeTracker.Entries().
Where(s => s.State == EntityState.Added || s.State == EntityState.Modified);
foreach (var entity in entities)
{
var validationContext = new ValidationContext(entity);
Validator.ValidateObject(entity, validationContext);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的所有 Db Context 类都继承自该基类。问题是,即使存在验证违规,该行Validator.ValidateObject()也不会抛出。ValidationException在调试器中我可以看到这一行已被执行。例如,对于下面的模型类,我尝试使用SaveChangesAsync()set Nameto进行调用null,但验证通过了:
public class MyModel : IEntity<long>
{
[Key]
public long Id { get; set; }
[Required]
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
IEntity<T>只是将属性强加于Id所有模型。
问题是该变量entity不保存实体实例,而是更改 tracker ( EntityEntry) 实例,因此代码试图验证错误的东西。
因此,要么重命名变量并使用entry.Entity属性:
var entries = this.ChangeTracker.Entries()
.Where(s => s.State == EntityState.Added || s.State == EntityState.Modified);
foreach (var entry in entries)
{
var validationContext = new ValidationContext(entry.Entity);
Validator.ValidateObject(entry.Entity, validationContext);
}
Run Code Online (Sandbox Code Playgroud)
或保持代码不变,但确保entities变量保存可枚举的实体实例:
var entities = this.ChangeTracker.Entries()
.Where(s => s.State == EntityState.Added || s.State == EntityState.Modified)
.Select(s => s.Entity); // <--
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1723 次 |
| 最近记录: |