.net core 实体框架核心异常先处理数据库

.net core 实体框架核心异常先处理数据库,.net-core,entity-framework-core,.net Core,Entity Framework Core,背景 采用ef核心代码优先的方法,验证既稳健又简单: 使用数据库优先的方法,当dbcontext.SaveChanges()时,数据库似乎在幕后进行任何验证被调用。更糟糕的是,这些异常是模糊的,完全没有帮助,例如,SqlException:String或二进制数据将被截断,如果any的字符串属性中的any的实体有太多的字符(我们的是一个充满char(10)之类的遗留应用程序),或者即使作为字符串的键保留为空 问题 我想知道是否有任何合理或可接受的方式来执行验证。我已经找到了可能有助于调试的方法,

背景
采用ef核心代码优先的方法,验证既稳健又简单:

使用数据库优先的方法,当
dbcontext.SaveChanges()时,数据库似乎在幕后进行任何验证被调用。更糟糕的是,这些异常是模糊的,完全没有帮助,例如,
SqlException:String或二进制数据将被截断,如果any的字符串属性中的any的实体有太多的字符(我们的是一个充满
char(10)
之类的遗留应用程序),或者即使作为字符串的键保留为空

问题
我想知道是否有任何合理或可接受的方式来执行验证。我已经找到了可能有助于调试的方法,但我希望在代码中强制执行约束


有没有比将每个自动属性更改为在不满足其约束时抛出的属性更好的方法?

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

当您使用数据库优先的方法时,EF core不会为验证生成任何注释,因为它不会对它们进行任何推理。这意味着您将只获得服务器端验证,这意味着在保存更改时出错


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

我最终使用了对生成器工具的psuedo扩展。因为DBContext是一个分部类,所以我创建了一个新类,它有一个main

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
,其中第一对的键是实体名称,值是一个查找和替换对的列表,用于编辑已通过相应验证生成的代码,每个属性一个。然后我所要做的就是滥用工具在
.cs
文件中生成类的事实,并在我的列表中迭代,对每个实体源代码文件执行替换


我更愿意做一些不太粗糙的事情,因为我依赖于ef工具输出的格式,但它可以工作

,但我们正在编写一个json rpc over http数据库api来取代旧的存储过程体系结构,而不是一个网站。所以重点仍然是sqlserver的验证错误消息完全没有价值,我需要一个解决方案,比如可能扩展代码生成工具来自动添加验证。不管是不是网站,提供API的框架都在进行验证,因为EF不会。因为代码中的验证是业务逻辑,所以从数据库中推断它们并不容易,所以数据库不会自己生成它们。您可以在从数据库生成模型后编写额外的代码,也可以尝试在EF core中修改代码编写器。虽然前者要容易得多。我担心的约束类型主要是数据库中的it
char(10)
,但属性只是字符串,因此从数据库中推断这些类型会非常简单,但是我想我需要自己添加它。你可以对生成的代码使用数据注释,这有助于某些情况,例如
nvarchar(10)
将实际构建
StringLength(10)
注释。但最终,每个客户的逻辑各不相同。一旦你开始添加一些验证框架,人们就会要求包含越来越多的逻辑,这些逻辑很容易变成复杂的特性。当EF实际上根本不尊重这些验证时,这对于外部库来说是个好主意,它可以扩展EF的代码生成,并为客户提供钩子来提供逻辑和脚手架验证注释。