首页 > 解决方案 > SqlException 导致所有后续数据库调用失败并出现相同的异常

问题描述

我在 ASP.NET Core 2.2 上有一个应用程序并使用 Entity Framework Core 2.2.6。

我刚遇到一个问题。我正在更新周期中的实体,就像这样

   foreach (EntityDTO entityDTO in entityList)
   {
       try
       {
            DBOperationOne(entityDTO)
            DBOperationTwo(entityDTO)
       }
       catch (Exception e)
       {
           Console.WriteLine(e.ToString());
       }
   }

对于一个实体,我得到了这个 SQL 异常

Microsoft.EntityFrameworkCore.DbUpdateException:更新条目时出错。有关详细信息,请参阅内部异常。

System.Data.SqlClient.SqlException:字符串或二进制数据将被截断。

没关系,我知道为什么会这样,但问题是下一个:在这个错误之后,所有后续对另一个实体的 db 调用都会导致相同的异常!即使它尝试使用绝对正确的数据更新其他字段!如果您尝试在实体框架之外运行生成的 SQL 以进行后续调用,它将成功完成!但是在这个循环中,所有后续调用都失败了

我的问题是:为什么会发生这种情况以及如何避免这种行为?

这里是 DBOperation 方法示例:

pulic Entity DBOperationOne(entityDTO)
{
    Entity entity = _mapper.Map<Entity>(entityDTO);
    _context.Entity.Add(entity);
    _context.SaveChanges();
    _context.Entry(entity).State = EntityState.Detached;
     return entity;
}

pulic Entity2 DBOperationTwo(entityDTO)
{
    Entity2 entity = _mapper.Map<Entity2>(entityDTO);
    _context.Entity2.Add(entity);
    _context.SaveChanges();
    _context.Entry(entity).State = EntityState.Detached;
     return entity;
}

谢谢你的帮助!

我试图将所有内容都放在TransactionScopewithRequiresNew事务中,但这无济于事

标签: c#asp.netentity-framework

解决方案


当您尝试将实体模型应用于数据库时,您的实体模型仍然具有导致 sql 异常的更改。因此,当您尝试使用下一次更改来更新数据库时,它也在尝试进行有问题的更新。

您可以通过添加验证来避免这种情况,以防止您的实体模型以一种在您尝试将更改应用于数据库时会中断的方式进行更改。


推荐阅读