c# - 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;
}
谢谢你的帮助!
我试图将所有内容都放在TransactionScope
withRequiresNew
事务中,但这无济于事
解决方案
当您尝试将实体模型应用于数据库时,您的实体模型仍然具有导致 sql 异常的更改。因此,当您尝试使用下一次更改来更新数据库时,它也在尝试进行有问题的更新。
您可以通过添加验证来避免这种情况,以防止您的实体模型以一种在您尝试将更改应用于数据库时会中断的方式进行更改。
推荐阅读
- c++ - 我可以内联应用到源位置信息吗?
- html - 如何解决这个组织 Web 应用程序的问题?
- javascript - 为什么我必须调用 await 两次才能解决承诺?
- tcp - c# xamarin Android,tcp连接问题,可以发送数据但收不到
- cypress - 赛普拉斯 - 如何等到应用程序准备好?
- java - XFA 填充 PDF 转换为静态 pdf
- ansible - 如何处理 Ansible 循环中的空列表
- c++ - 如何在 C++ 中检查声明的标识符?
- amazon-web-services - 使用 AWS CLI 命令创建 AWS QuickSight 资源
- python - 无法从网站 Python 获取 cookie