来自EntityFramework上下文的SaveChanges()静默失败

本文关键字:静默 失败 SaveChanges EntityFramework 上下文 来自 | 更新日期: 2023-09-27 18:10:57

我使用实体框架6.1模型从数据库'向导'设置。当我从上下文创建一个Business对象,然后尝试添加for附件,然后SaveChanges()时,什么都没有发生。是否有跟踪模式?或者我可以打开看看被子下面到底发生了什么。

简单的例子:

 var fb = _context.Business.Create();
 //fb.Id exists and is an int but it is auto incr in the db
 fb.Name = ub.ACCOUNT_NAME;
 fb.ServiceManager = ub.SERVICE_MANAGER;
 fb.AccountManager = ub.ACCOUNT_MANAGER;
 fb.SalesPerson = ub.SALESPERSON;
 fb.Created = DateTime.UtcNow;
 fb.Updated = DateTime.UtcNow;
 _context.Add(fb);
 _context.SaveChanges();

来自EntityFramework上下文的SaveChanges()静默失败

我发现捕获EF错误的最佳方法是重写SaveChange方法,如下所示。如果您有一个中心位置来恢复日志(如log4net),该函数将能够在那里插入日志。

public partial class Business
{
    /// <summary>Override the SaveChange to return better error messages</summary>
    public override int SaveChanges()
    {
        try {
            return base.SaveChanges();
        }
        catch (System.Data.Entity.Validation.DbEntityValidationException ex) {
            // Retrieve the error messages as a list of strings.
            var errorMessages = ex.EntityValidationErrors
                    .SelectMany(x => x.ValidationErrors)
                    .Select(x => x.ErrorMessage);
            // Join the list to a single string.
            var fullErrorMessage = string.Join("; ", errorMessages);
            // Combine the original exception message with the new one.
            var exceptionMessage = string.Concat(ex.Message, " The validation errors are: ", fullErrorMessage);
            // Add some logging with log4net here

            // Throw a new DbEntityValidationException with the improved exception message.
            throw new System.Data.Entity.Validation.DbEntityValidationException(exceptionMessage, ex.EntityValidationErrors);
        }
    }

您是否尝试检查任何验证错误?

这是我在一个新类中使用的try块和验证方法,所以把它当作一个代码样本,而不是100%测试的解决方案,因为我仍然把一些单元测试放在一起:

public List<string> ValidationErrorList = new List<string>();

try
{
  _context.SaveChanges();
}
catch (Exception)
{
  GetErrors(_context);
}
private void GetErrors(System.Data.Entity.DbContext context)
{
  IEnumerable<System.Data.Entity.Validation.DbEntityValidationResult> ve;
  ve = context.GetValidationErrors();
  ValidationErrorList.Clear();
  foreach (var vr in ve)
  {
    if (vr.IsValid == false)
    {
      foreach (var e in vr.ValidationErrors)
      {
        var errorMessage = e.PropertyName.Trim() + " : " +
                           e.ErrorMessage;
        ValidationErrorList.Add(errorMessage);
      }
    }
  }
}

虽然上面的示例只在触发异常时调用GetErrors方法,但您可能还想尝试在SaveChanges()之后调用它,以查看是否存在没有抛出异常的验证错误。

您是否尝试过创建一个新的Business对象并将其添加进去?而不是先创造一个?

 var fb = new Business();
 //fb.Id exists and is an int but it is auto incr in the db
 fb.Name = ub.ACCOUNT_NAME;
 fb.ServiceManager = ub.SERVICE_MANAGER;
 fb.AccountManager = ub.ACCOUNT_MANAGER;
 fb.SalesPerson = ub.SALESPERSON;
 fb.Created = DateTime.UtcNow;
 fb.Updated = DateTime.UtcNow;
 _context.Business.Add(fb);
 _context.SaveChanges();