背景
使用ef核心代码第一种方法,验证是健壮且简单的: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可能有助于调试,但我想在代码中强制执行约束
是否有更好的方法,而不是将每个自动财产更改为在未满足约束条件的情况下抛出的属性?
答案 0 :(得分:1)
EntityFramework Core根本不执行任何验证。您在示例中看到的验证规则由MVC强制执行,而不是EF。 EF Core删除验证检查的主要原因之一是。验证在UI中运行,然后在EF中运行,然后再在数据库中运行,这只是多余的。因此,客户端验证留给前端(在这种情况下为MVC),服务器端由数据库引擎完成。
当您使用数据库优先方法时,EF核心不会生成任何用于验证的注释,因为它无论如何都不会对它们进行推理。这意味着您将只获得服务器端验证,这意味着在SaveChanges期间出现错误。
在代码(客户端)中强制执行约束的唯一方法是编写这些注释,以便MVC可以强制执行它们或编写自定义代码来处理它。整个验证机制对EF是透明的。
答案 1 :(得分:0)
我最终使用psuedo扩展到生成器工具。由于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工具输出的格式,但它有效