2017-05-05 105 views
0

我开始在实体框架中使用.net核心(asp.net核心)。C#实体框架(.Net Core)验证(服务器端)如何?

我打算实施一个web服务(使用asp.net和GraphQL)。 现在我不知道是否有可能在实体框架中使用RegularExpression属性进行验证。

但它似乎被忽略。

我发现这些属性的所有示例都是C#中的客户端和服务器端。

这是不应该在EF(伺服器)这样的工作?

有没有简单的方法来使这项工作,而不写大量的代码?

PS:使用“Microsoft.EntityFrameworkCore”在PostgreSQL

IM为什么下面的代码不抛出一个异常如果Book.something的正则表达式不符合(PS:它也没有触发,如果它满足):

... 
    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

的正则表达式的属性,它不是一个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核心1.1中存在错误(因为它在.net 4.6中使用ef6时不能使用) –

0

似乎是在当前dotnetcore版本验证属性在所有问题??不工作。

但是什么工作原理是:仅适用于ASP .NET进来的数据

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