gpt4 book ai didi

entity-framework-core - 如何在 EntityFramework Core 2 中的 SaveChanges 之前验证模型?

转载 作者:行者123 更新时间:2023-12-04 03:08:14 24 4
gpt4 key购买 nike

我想验证使用 Entity Framework Core 保存的对象图(来自不同但相关的实体)。在 Entity Framework 6 中,框架在 SaveChanges 操作中对其进行验证。在 EF Core 中,文档说验证不是自动执行的。因此,在 ASP MVC Core 中,我们可以使用 ModelState.IsValid。但是,我没有使用 ASP MVC,我更喜欢不依赖于那个非常大的框架。

无论如何,我如何在 EntityFramework Core 2 中的 SaveChanges 之前验证模型,而不依赖于完整的 ASP MVC 框架?

最佳答案

是的,看起来没有开箱即用的验证。您可以通过覆盖 SaveChanges 自行处理。 :

public class MyContext : DbContext
{
public virtual DbSet<Model> Models { get; set; }

public MyContext()
{
}

public override int SaveChanges()
{
var changedEntities = ChangeTracker
.Entries()
.Where(_ => _.State == EntityState.Added ||
_.State == EntityState.Modified);

var errors = new List<ValidationResult>(); // all errors are here
foreach (var e in changedEntities)
{
var vc = new ValidationContext(e.Entity, null, null);
Validator.TryValidateObject(
e.Entity, vc, errors, validateAllProperties: true);
}

return base.SaveChanges();
}
}

public class Model
{
[Key]
public int Id { get; set; }

[Required]
[MaxLength(32)]
public string Field { get; set; }

[Range(15, 25)]
public int RangeField { get; set; }
}
  • 属性(property)validateAllProperties很重要,因为没有它你
    不会得到范围验证。
  • 不要忘记覆盖 SaveChangesAsync .

  • 如果您使用 fluent syntax 设置约束,这将不会真正有帮助, 很遗憾。实际上,如 fluent syntax可能不仅可以添加新的约束,还可以覆盖现有的,最好完全切换到属性注释,或者寻找其他方式进行验证。

    关于entity-framework-core - 如何在 EntityFramework Core 2 中的 SaveChanges 之前验证模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45775267/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com