2017-08-19 5 views
1

Entity Frameworkコアで保存されている(異なるが関連するエンティティからの)オブジェクトのグラフを検証したいと考えています。 Entity Framework 6では、フレームワークはSaveChanges操作でそのフレームワークを検証します。 EFコアでは、検証は自動的に実行されないという。したがって、ASP MVCコアでは、ModelState.IsValidを使用できます。しかし、私はASPのMVCを使用していないと私は非常に大きなフレームワークに依存しないことを好む。EntityFramework Core 2でSaveChangesの前にモデルを検証する方法は?

とにかく、完全なASP MVCフレームワークに依存せずに、EntityFramework Core 2でSaveChangesの前にモデルを検証する方法はありますか?

答えて

2

ええ、箱からの検証がないようです。あなたは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; } 
} 
  • それなしであなた は、範囲の検証を取得することはありませんので、プロパティvalidateAllPropertiesが重要です。
  • SaveChangesAsyncを上書きすることを忘れないでください。

残念なことに、fluent syntaxで制約を設定すると、このことは実際には役に立ちません。実際には、fluent syntaxは新しい制約を追加するだけでなく、既存の属性を上書きすることもできるため、属性の注釈に完全に切り替えるか、検証を行う別の方法を見つける方がよいでしょう。

+0

完璧!これはすばらしい。私はテストします... – gabomgp

関連する問題