首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >EF代码优先:如何在nuget包控制台中看到'EntityValidationErrors‘属性?

EF代码优先:如何在nuget包控制台中看到'EntityValidationErrors‘属性?
EN

Stack Overflow用户
提问于 2012-04-19 08:05:37
回答 5查看 71.7K关注 0票数 128

我对此感到困惑:

我已经为实体框架(4.1.3)代码优先方法定义了我的类。一切都很好(我正在创建表等等)直到我开始播种。

现在当我这样做时

代码语言:javascript
复制
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控制台中跟踪它?

EN

回答 5

Stack Overflow用户

发布于 2012-05-21 03:32:59

我最近也被这件事惹恼了。我通过在种子方法的Configuration类中放置一个包装器函数来修复它,并将对SaveChanges的调用替换为对我的函数的调用。此函数将简单地枚举EntityValidationErrors集合中的错误,并在异常消息列出各个问题的情况下重新抛出异常。这会使输出显示在NuGet包管理器控制台中。

代码如下:

代码语言:javascript
复制
/// <summary>
/// Wrapper for SaveChanges adding the Validation Messages to the generated exception
/// </summary>
/// <param name="context">The context.</param>
private void SaveChanges(DbContext context) {
    try {
        context.SaveChanges();
    } catch (DbEntityValidationException ex) {
        StringBuilder sb = new StringBuilder();

        foreach (var failure in ex.EntityValidationErrors) {
            sb.AppendFormat("{0} failed validation\n", failure.Entry.Entity.GetType());
            foreach (var error in failure.ValidationErrors) {
                sb.AppendFormat("- {0} : {1}", error.PropertyName, error.ErrorMessage);
                sb.AppendLine();
            }
        }

        throw new DbEntityValidationException(
            "Entity Validation Failed - errors follow:\n" + 
            sb.ToString(), ex
        ); // Add the original exception as the innerException
    }
}

只需在种子方法中将对context.SaveChanges()的调用替换为SaveChanges(context)即可。

票数 218
EN

Stack Overflow用户

发布于 2013-03-13 05:46:03

我将Richards的答案转换为扩展方法:

代码语言:javascript
复制
  public static int SaveChangesWithErrors(this DbContext context)
    {
        try
        {
            return context.SaveChanges();
        }
        catch (DbEntityValidationException ex)
        {
            StringBuilder sb = new StringBuilder();

            foreach (var failure in ex.EntityValidationErrors)
            {
                sb.AppendFormat("{0} failed validation\n", failure.Entry.Entity.GetType());
                foreach (var error in failure.ValidationErrors)
                {
                    sb.AppendFormat("- {0} : {1}", error.PropertyName, error.ErrorMessage);
                    sb.AppendLine();
                }
            }

            throw new DbEntityValidationException(
                "Entity Validation Failed - errors follow:\n" +
                sb.ToString(), ex
            ); // Add the original exception as the innerException
        }
    }

像这样调用:

代码语言:javascript
复制
context.SaveChangesWithErrors();
票数 36
EN

Stack Overflow用户

发布于 2012-10-27 00:52:40

我将craigvl的版本转换为C#,我必须添加context.SaveChanges();才能让它为我工作,如下所示。

代码语言:javascript
复制
try
{
    byte[] bytes = System.IO.File.ReadAllBytes(@"C:\Users\sheph_000\Desktop\Rawr.png");
    Console.WriteLine(bytes);

    context.BeverageTypes.AddOrUpdate(
        x => x.Name,
        new AATPos.DAL.Entities.BeverageType { ID = 1, Name = "Sodas" }
        );

    context.Beverages.AddOrUpdate(
        x => x.Name,
        new AATPos.DAL.Entities.Beverage { ID = 1, Name = "Coke", BeverageTypeID = 1, ImageData = bytes, IsStocked = true, StockLevel = 10, Price = 10.00M, ImageMimeType = "test" },
        new AATPos.DAL.Entities.Beverage { ID = 2, Name = "Fanta", BeverageTypeID = 1, ImageData = bytes, IsStocked = true, StockLevel = 10, Price = 10.00M, ImageMimeType = "test" },
        new AATPos.DAL.Entities.Beverage { ID = 3, Name = "Sprite", BeverageTypeID = 1, ImageData = bytes, IsStocked = true, StockLevel = 10, Price = 10.00M, ImageMimeType = "test" },
        new AATPos.DAL.Entities.Beverage { ID = 4, Name = "Cream Soda", BeverageTypeID = 1, ImageData = bytes, IsStocked = true, StockLevel = 10, Price = 10.00M, ImageMimeType = "test" },
        new AATPos.DAL.Entities.Beverage { ID = 5, Name = "Pepsi", BeverageTypeID = 1, ImageData = bytes, IsStocked = true, StockLevel = 10, Price = 10.00M, ImageMimeType = "test" }
        );

    context.SaveChanges();
}
catch (System.Data.Entity.Validation.DbEntityValidationException ex)
{
    var sb = new System.Text.StringBuilder();
    foreach (var failure in ex.EntityValidationErrors)
            {
                sb.AppendFormat("{0} failed validation", failure.Entry.Entity.GetType());
        foreach (var error in failure.ValidationErrors)
                {
            sb.AppendFormat("- {0} : {1}", error.PropertyName, error.ErrorMessage);
            sb.AppendLine();
                }
            }

    throw new Exception(sb.ToString());
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10219864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档