我为此感到茫然:
我已经为实体框架(4.1.3)代码第一种方法定义了我的类 . 一切都很好(我正在制作 table 等),直到我开始播种 .
现在当我这样做的时候
Add-Migration "remigrate" ; Update-Database;
我在程序包控制台上收到错误“一个或多个实体的验证失败 . 有关详细信息,请参阅'EntityValidationErrors'属性 . ”
我的Seed()方法中有一个断点但因为我对如何获取细节毫无头绪(PS - 我看过线程Validation failed for one or more entities while saving changes to SQL Server Database using Entity Framework,它显示了我如何看到该属性 . )
我知道我的Seed()方法有问题,因为如果我在方法调用之后立即返回,则错误消失 . 那么如何设置断点以便我可以看到验证错误是什么?有点失落 . 或者是否有其他方法可以在nuget控制台中跟踪它?
6 回答
我最近也对此感到恼火 . 我通过在Seed方法的Configuration类中放置一个包装器函数来修复它,并通过调用我的函数来替换对
SaveChanges
的调用 . 此函数将简单地枚举EntityValidationErrors
集合中的错误,并重新抛出异常消息列出各个问题的异常 . 这使得输出显示在NuGet包管理器控制台中 .代码如下:
只需在种子方法中用
SaveChanges(context)
替换context.SaveChanges()
的调用 .Extend Your DBContext Class Already With a Partial Class Definition!
如果您查看DbContext的类定义,它将类似于以下内容:
因此,在另一个文件中,您可以创建相同的定义并覆盖您想要的部分 .
部分类的整个想法 - 你注意到 DbContext 是一个部分类 - 是你可以扩展一个已生成的类(或将类组织成多个文件),在我们的例子中我们也想 override SaveChanges 方法从添加到 DbContext 的部分类中 .
这样我们就可以从所有现有的DbContext / SaveChanges调用中获取错误调试信息,而不必更改种子代码或开发代码 .
这就是我要做的事情( NOTE ,不同之处在于我只是在我们自己编写的 DbContext 部分类中重写了SaveChanges方法,而不是生成的一个) . 另外,请确保您的部分课程使用 correct namespace ,否则您将撞到墙上 .
我将Richards的答案转换为扩展方法:
像这样打电话:
我将craigvl的版本转换为C#我必须添加context.SaveChanges();为了它对我有用,如下所示 .
理查德感谢让我在正确的道路上(有相同的问题)下面是一个替代品,没有包装器,这在迁移配置种子方法中对我有用:
然后能够在包管理器控制台中看到异常 . 希望这有助于某人 .