2017-05-05 14 views
0

私はEntity Frameworkで.net core(asp.net core)を使い始めました。C#Entity Framework(.Net Core)検証(サーバー側)

(asp.netとGraphQLを使用して)Webサービスを実装する予定です。 今、Entity Frameworkでの検証にRegularExpression属性を使用することは可能でしょうか。

しかし、これは無視されているようです。

このような属性で見つかったすべてのサンプルは、C#のクライアント側とサーバー側でした。

これは、このようなEF(serveides)で動作するはずですか?

大量のコードを書くことなくこの作業を行う簡単な方法はありますか?

PS:

:イムはPostgreSQLの

はなぜBook.somethingための正規表現は、(:それは出会いだ場合、それはまた、発射いないPS)を満たしていない場合に例外をスローしませコードを以下れると「Microsoft.EntityFrameworkCore」を使用して

... 
    using Microsoft.EntityFrameworkCore; 
    using System.ComponentModel.DataAnnotations; 

    namespace aspPlainEF 
    { 
     public class Startup 
     { 
      EFCoreDemoContext ef = new EFCoreDemoContext(); 

      ... 

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

       ... 
       [Required] 
       [RegularExpression(@"^hello$", ErrorMessage = "You can not have that")] 
       public string something { get; set; } 

      } 

      public class EFCoreDemoContext : DbContext 
      { 
       public DbSet<Book> Books { get; set; } 

       protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { 
        optionsBuilder.UseNpgsql(...); 
       } 
      } 

      public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
      { 
       ... 

       app.Run(async (context) => 
       { 
        Book book = new Book(); 
        ... 
        book.something = "xxx"; 
        ef.Add(book); ef.SaveChanges(); 
        await context.Response.WriteAsync("hell1"); 
       }); 
      } 
     } 
    } 
+0

正規表現はASP .NET用のデータをincommingに適用される属性は、EFのエンティティの検証ではありません。自分のバリデータをリフレクションで書くことができます。独自の属性を作成し、その属性をクラスで検索して検証します(これは非常に概要ですが、そのアイデアははっきりしています)。 – Gusman

+0

@Gusman少なくとも以前のバージョンでは、EFは検証属性を適用したエンティティを自動的に検証することを覚えていますか? https://msdn.microsoft.com/en-us/library/gg193959.aspxそれはまだ、コアになっていない可能性があります。 –

+0

@AlexPavenまあ、それはあなたが正しいと思う、私は非常にEFと錆びている、私は自分自身をリサイクルする必要があります...(それは私が答えとしてそれを追加しなかった理由:/)。 – Gusman

答えて

2

詳しくは、Validation in EF Core投稿を参照してください。

は、ここでの要点です:

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, 
      validateAllProperties: true); 
    } 

    return base.SaveChanges(); 
} 
+0

thxですが、これでも.netコアでは動作しません。 Validator.ValidateObject(entity、validationContext)が正しく呼び出されていることがわかりますが、単に行を渡していきます。.net core 1.1のバグを前提にしています(ef6で.net 4.6のボックスの外で動作します) –

0

は、すべての??では動作しません、現在のdotnetcoreバージョンの検証属性に問題があると思われます。しかし、どのような作品

は次のとおりです。

public class Book : IValidatableObject 
    { 
    ... 
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
     { 
      if (something != "hello") 
      { 
       yield return new ValidationResult("Error message goes here"); 
      } 
     } 
関連する問題