2017-08-09 82 views
0

背景
与英法的核心代码第一种方法,验证是强大和简单:https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-mvc-app/validation实体框架的核心化异常处理分贝第一

与数据库的第一种方法,它似乎像任何验证正在发生由幕后数据库时调用dbcontext.SaveChanges();。更糟的是,这些异常是模糊的和完全没有帮助,例如,SqlException: String or binary data would be truncated可以抛出,如果实体的任何的字符串属性的任何有太多的字符(我们是一个传统的应用程序充满了char(10)和这样),或者即使是一个字符串的键也是空的。

问题
我想知道是否有任何合理或可接受的方式来执行验证。我发现this question这可能有助于调试,但我想执行的约束代码

有什么不是改变每一个汽车财产一抛出,如果它的约束得不到满足更好的方法?

回答

1

EntityFramework Core根本不执行任何验证。您在示例中看到的验证规则由MVC而不是EF强制执行。 EF Core删除验证检查的主要原因之一仅在于此。验证在UI中运行,然后在EF中运行,然后在数据库中运行,只是多余的。因此,客户端验证留给前端(在这种情况下为MVC),服务器端由数据库引擎完成。

当您使用数据库优先方法时,EF核心不会为验证生成任何注释,因为它无论如何都不会推理它们。这意味着您只会得到服务器端验证,这意味着在SaveChanges期间出现错误。

在代码(客户端)中强制执行约束的唯一方法是编写这些注释,以便MVC可以强制执行它们或编写自定义代码来处理它。整个验证机制对EF透明。

+0

,但我们正在写一个JSON-RPC over HTTP的数据库API来代替我们旧的存储过程架构,而不是一个网站。所以问题仍然是,sqlserver的验证错误信息完全没有价值,我需要一个解决方案,比如扩展代码生成工具以自动添加验证 –

+0

无论是否为网站,您的提供API的框架都在进行验证,因为EF只是不会。由于代码中的验证是业务逻辑,所以从数据库中推断它们并不容易,因此数据库首先不会自行生成它们。您可以在从数据库生成模型之后编写额外的代码,也可以尝试在EF内核中修改代码编写器。虽然前者会容易得多。 – Smit

+0

主要是我担心的约束类型就像它在db中的char(10)一样,但属性只是字符串,所以这些类型可以非常简单地从数据库中推断出来,但我想我'我需要自己添加它 –

0

我结束了对发电机工具的伪装扩展。由于的DbContext是一个局部类,我由具有主

public partial class DBContext{ 
    public static void Main(string[]args){ 
     DBContext context = new DBContext(); 
     var modelbuilder = new Microsoft.EntityFrameworkCore.ModelBuilder(new Microsoft.EntityFrameworkCore.Metadata.Conventions.ConventionSet()); 
     context.OnModelCreating(modelbuilder); 
     IMutableModel model=modelbuilder.Model; 
从那里我使用LINQ到大约每个实体的属性,并在其上的注解的各种信息转换成 List<KeyValuePair<string,List<KeyValuePair<Regex,string>>>>其中第一对重点

一个新的类是实体名称,值是查找和替换对的列表,用于编辑已通过相应验证生成的代码,每个属性一个。然后,我所要做的就是滥用这个事实,即该工具生成<className>.cs文件中的类,并遍历我的列表,为每个实体源代码文件执行替换。

我更喜欢做一些不那么哈克,因为我依靠格式的EF工具输出,但它的工作原理