Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#实体框架(.Net核心)验证(服务器端)如何进行?_C#_Asp.net_.net_Entity Framework_Entity Framework Core - Fatal编程技术网

C#实体框架(.Net核心)验证(服务器端)如何进行?

C#实体框架(.Net核心)验证(服务器端)如何进行?,c#,asp.net,.net,entity-framework,entity-framework-core,C#,Asp.net,.net,Entity Framework,Entity Framework Core,我开始在实体框架中使用.NETCore(asp.NETCore) 我计划实现一个webservice(使用asp.net和GraphQL)。 现在我想知道是否可以在实体框架中使用RegularExpression属性进行验证 但它似乎被忽视了 我找到的所有具有这些属性的示例都是C#中的客户端和服务器端 这不应该在EF(serveside)中像这样工作吗 有没有一种简单的方法可以在不编写大量代码的情况下实现这一点 PS:我在PostgreSQL中使用“Microsoft.EntityFramewo

我开始在实体框架中使用.NETCore(asp.NETCore)

我计划实现一个webservice(使用asp.net和GraphQL)。 现在我想知道是否可以在实体框架中使用RegularExpression属性进行验证

但它似乎被忽视了

我找到的所有具有这些属性的示例都是C#中的客户端和服务器端

这不应该在EF(serveside)中像这样工作吗

有没有一种简单的方法可以在不编写大量代码的情况下实现这一点

PS:我在PostgreSQL中使用“Microsoft.EntityFrameworkCore”

如果Book.something的RegularExpression不满足,为什么下面的代码没有引发异常(ps:如果满足,它也不会触发):

。。。
使用Microsoft.EntityFrameworkCore;
使用System.ComponentModel.DataAnnotations;
名称空间aspPlainEF
{
公营创业
{
EFCoreDemoContext ef=新的EFCoreDemoContext();
...
公共课堂用书
{
[关键]
公共int Id{get;set;}
...
[必需]
[RegularExpression(@“^hello$”,ErrorMessage=“您不能拥有它”)]
公共字符串something{get;set;}
}
公共类EFCoreDemoContext:DbContext
{
公共数据库集书籍{get;set;}
配置时受保护的覆盖无效(DBContextOptions Builder Options Builder){
optionsBuilder.UseNpgsql(…);
}
}
公共void配置(IApplicationBuilder应用程序、IHostingEnvironment环境、iLogger工厂)
{
...
app.Run(异步(上下文)=>
{
书=新书();
...
book.something=“xxx”;
ef.Add(book);ef.SaveChanges();
wait context.Response.WriteAsync(“hell1”);
});
}
}
}
有关详细信息,请参阅我的帖子

以下是它的要点:

public override int SaveChanges()
{
var entities=来自ChangeTracker.Entries()中的e
其中e.State==EntityState.Added
||e.State==EntityState.Modified
选择e.实体;
foreach(实体中的var实体)
{
var validationContext=新的validationContext(实体);
Validator.ValidateObject(
实体,
validationContext,
validateAllProperties:true);
}
返回base.SaveChanges();
}

当前的dotnetcore版本验证属性根本不起作用,这似乎是个问题

但有效的方法是:

    public class Book : IValidatableObject
    {
    ...
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            if (something != "hello")
            {
                yield return new ValidationResult("Error message goes here");
            }
        }
公共类书:IValidatableObject
{
...
公共IEnumerable验证(ValidationContext ValidationContext)
{
如果(某事!=“你好”)
{
返回新的ValidationResult(“此处显示错误消息”);
}
}

RegularExpression属性仅适用于ASP.NET的输入数据,它不是EF实体验证。您可以通过反射编写自己的验证程序,创建自己的属性,一个在类中搜索该属性并进行验证的类(这是一个非常粗略的描述,但我认为想法很清楚).@Gusman我似乎记得,至少在以前的版本中,EF会自动验证应用了验证属性的实体?这可能还没有进入core,但如果有的话。@AlexPaven,看来你是对的,我对EF很生疏,我需要回收自己…(这就是为什么我没有添加它作为答案:/).我用.Net 4.6在EF6上对它进行了测试,它是开箱即用的,因此它似乎是一个.note核心问题。仍然需要手动实现验证吗?thx用于回复,但即使这样,它在.Net核心中也不起作用。我看到了Validator.ValidateObject(实体,validationContext)被正确调用,但它只是越界并继续…假设.net core 1.1中存在错误(因为它在.net 4.6中使用ef6时是现成的)
    public class Book : IValidatableObject
    {
    ...
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            if (something != "hello")
            {
                yield return new ValidationResult("Error message goes here");
            }
        }