2016-09-14 2 views
1

データ注釈付きのモデルがあり、データ注釈が失敗した場合にSaveChangesメソッドを失敗させることができたかどうか疑問に思っていましたか?EF Core SaveChangesがデータ注釈に対して有効であるか

私はSaveChangesが "Test2が2から4の範囲外です"という行に沿って例外をスローすることを期待していました。代わりに、データベースに保存されます。

たとえば、ここに私のテストエンティティです:

public class Visit 
{ 
    public int Id { get; set; } 

    [MaxLength(2)] 
    public string Test { get; set; } 

    [Range(2, 4)] 
    public int Test2 { get; set; } 
} 

はここにコンテキストの:

public class Context : DbContext 
{ 
    public Context() 
    { 

    } 

    public Context(DbContextOptions<Context> options) 
      : base(options) 
    { 
    } 

    public DbSet<Visit> Visits { get; set; } 
} 

そして、ここでは、私はそれをテストするために使用している非常にシンプルなMVCコントローラのメソッドです:

public HomeController(Context context) 
    { 
     context.Visits.Add(new Visit() {Test = "21", Test2 = 3423}); 
     var results = context.SaveChanges(); 
    } 

私のproject.jsonファイルは次のとおりです。

{ 
    "dependencies": { 
    "Microsoft.AspNetCore.Diagnostics": "1.0.0", 
    "Microsoft.AspNetCore.Mvc": "1.0.0", 
    "Microsoft.AspNetCore.Razor.Tools": { 
     "version": "1.0.0-preview2-final", 
     "type": "build" 
    }, 
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0", 
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.0", 
    "Microsoft.AspNetCore.StaticFiles": "1.0.0", 
    "Microsoft.EntityFrameworkCore.SqlServer": "1.0.0", 
    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final", 
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0", 
    "Microsoft.Extensions.Configuration.Json": "1.0.0", 
    "Microsoft.Extensions.Logging": "1.0.0", 
    "Microsoft.Extensions.Logging.Console": "1.0.0", 
    "Microsoft.Extensions.Logging.Debug": "1.0.0", 
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0", 
    "Microsoft.NETCore.App": { 
     "version": "1.0.0", 
     "type": "platform" 
    }, 
    "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0", 
    "System.ComponentModel.Annotations": "4.1.0" 
    }, 

    "tools": { 
    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final", 
    "BundlerMinifier.Core": "2.0.238", 
    "Microsoft.AspNetCore.Razor.Tools": "1.0.0-preview2-final", 
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final" 
    }, 

    "frameworks": { 
    "netcoreapp1.0": { 
     "dependencies": { 
     }, 
     "imports": [ 
     "dotnet5.6", 
     "portable-net45+win8" 
     ] 
    } 
    }, 

    "buildOptions": { 
    "emitEntryPoint": true, 
    "preserveCompilationContext": true 
    }, 

    "runtimeOptions": { 
    "configProperties": { 
     "System.GC.Server": true 
    } 
    }, 

    "publishOptions": { 
    "include": [ 
     "wwwroot", 
     "Views", 
     "Areas/**/Views", 
     "appsettings.json", 
     "web.config" 
    ] 
    }, 

    "scripts": { 
    "prepublish": [ "bower install", "dotnet bundle" ], 
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ] 
    } 
} 
+1

EF CoreはEF6のようなデータ検証を実行しません。 –

+1

@ stephen.vakilコメントではなく答えとして投稿してください。 ;-) – bricelam

答えて

1

あなたは、SaveChangesメソッドをオーバーライドすることで独自の検証を実装することができます

class Context : DbContext 
    { 
     public override int SaveChanges() 
     { 
      var entities = from e in ChangeTracker.Entries() 
          where e.State == EntityState.Added 
           || e.State == EntityState.Modified 
          select e.Entity; 
      foreach (var entity in entities) 
      { 
       var validationContext = new ValidationContext(entity); 
       Validator.ValidateObject(entity, validationContext); 
      } 

      return base.SaveChanges(); 
     } 
    } 

これはあなたのデータの注釈に対して検証し、検証が失敗した場合は例外をスローします。

+0

私はそれが必要な属性を検証するだけだと思う​​、あなたはまた、MaxLengthなどを検証するためにここのアプローチを使用する必要がありますhttps://github.com/aspnet/EntityFrameworkCore/issues/9662 – NPNelson

関連する問題