C# SqlException导致所有后续数据库调用失败,并出现相同的异常

C# SqlException导致所有后续数据库调用失败,并出现相同的异常,c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,我在ASP.NET Core 2.2上有一个应用程序,使用实体框架Core 2.2.6 我只是遇到了一个问题。我正在更新周期中的实体,如下所示 foreach (EntityDTO entityDTO in entityList) { try { DBOperationOne(entityDTO) DBOperationTwo(entityDTO) } catch (Excepti

我在ASP.NET Core 2.2上有一个应用程序,使用实体框架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,它将成功完成!但是在这个循环中,所有后续调用都失败了

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

下面是操作方法示例:

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;
}
pulic实体数据库操作一(entityDTO)
{
实体=_mapper.Map(entityDTO);
_context.Entity.Add(实体);
_SaveChanges();
_context.Entry(entity.State=EntityState.Detached;
返回实体;
}
脉冲实体2数据操作2(实体到)
{
Entity2实体=_mapper.Map(entityDTO);
_context.Entity2.Add(实体);
_SaveChanges();
_context.Entry(entity.State=EntityState.Detached;
返回实体;
}
谢谢你的帮助


我已尝试使用
RequiresNew
事务将所有内容放置在
事务范围中,但这无助于很好地理解您的行
\u上下文。Entry(entity).State=EntityState.Detached
在抛出错误后发生。SaveChanges

所以这永远不会发生(因此上下文仍然认为下次需要添加)

如果移动行
\u context.Entry(entity.State=EntityState.Detached
到try/finally的finally块,这样就可以了,因为在SaveChanges()中发生错误时仍然会发生这种情况

乙二醇

公共实体DBOperationOne(entityDTO)
{
实体=_mapper.Map(entityDTO);
尝试
{ 
_context.Entity.Add(实体);
_SaveChanges();
}
最后
{
_context.Entry(entity.State=EntityState.Detached;
}
返回实体;
}

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


您可以通过添加验证来避免更改,以防止实体模型的更改在您尝试将更改应用到数据库时中断。

为什么要尝试保存不适合的数据?将验证添加到你的应用程序以确保你不会试图保存错误数据。这是不存储和重用EF上下文的众多原因之一。为每个逻辑操作创建一个新的。@Evk嘿,如果它是通过DependencyInjection注入的,我怎么做?你能给我一些关键词吗,我知道这可能是非常基本的,但我的脑袋在转,谢谢你advance@user2489102工厂模式允许您注入一个按需创建DB上下文的工厂。在web服务器中,通常的做法是为每个请求注入一个上下文。然而,尝试从错误中恢复并不是常见的做法(通常,错误会直接传到客户端,然后客户端可能会重试)。因此,在您的情况下,您可以插入上下文工厂,然后在每次需要时从该工厂解析新实例。你是说手动验证吗?或者Asp.Net中已经存在解决方案?
public Entity DBOperationOne(entityDTO)
{
    Entity entity = _mapper.Map<Entity>(entityDTO);
    try
    { 
        _context.Entity.Add(entity);
        _context.SaveChanges();
    }
    finally
    {
        _context.Entry(entity).State = EntityState.Detached;
    }
    return entity;
}