asp.net 在Microsoft.EntityFrameworkCore.dll中发生类型为“Microsoft.EntityFrameworkCore.DbUpdateException”的异常

x3naxklr  于 2022-12-15  发布在  .NET
关注(0)|答案(4)|浏览(272)

我有麻烦在很长一段时间。让我们想象这个例子:

public class Coordinate {

     public int id {get;set;}
     public int x {get;set;}
     public int y {get;set;}
}
public class Planet {

     public int id {get;set;}
     public string name {get;set;}
     public Coordinate coordinate {get;set;}
}

我已经创建了两个模型,其中Planet模型的属性是坐标,现在假设我在代码的某个地方创建了一个坐标,并将其存储在数据库中,假设坐标如下:

Coordinate c = new Coordinate();
c.x = 1;
c.y = 2;

然后将其添加到数据库并保存。
但是当我创造了一个星球,我做到了:

planet.coordinate = c;

然后我尝试将其添加到数据库,我有以下错误:
Microsoft.EntityFrameworkCore.dll中发生了类型为“Microsoft.EntityFrameworkCore.DbUpdateException”的异常,但未在用户代码中处理
补充信息:更新条目时出错。有关详细信息,请参见内部异常。
我知道我可以将属性public Coordinate coordinate更改为public int coordinate_id,但我想使用坐标模型来执行此操作。
我正在使用ASP NET CORE 1.0
坎普斯

xienkqul

xienkqul1#

问题是此时c已经有了一个Id。
使用planet.Add,planet和所有附加到它的坐标将在您的DbSet中设置为Added,并且在调用SaveChanges时,将创建insert语句。(这里我假设您的列和Id属性上有一个自动增量)
当SaveChanges完成后,EF会看到行星在数据库中,但是刚刚添加的坐标的Id不同(它被DBMS更改了,所以现在坐标在数据库中是两次,具有两个不同的Id),所以它会认为出现了错误并抛出此异常。
如果不存在重复条目的问题,请将ID设置为null或0。否则,有两种解决方案:

  • 仅设置FK属性,不设置导航属性
  • 仅调用SaveChanges一次(例如,仅添加行星,但是添加坐标关系修复应导致相同的结果)
9njqaruj

9njqaruj2#

查看内部异常将给予您更详细地了解出了什么问题。
要做到这一点,在调试模式下,当异常显示时,单击查看详细信息,并按照树,直到您找到内部异常。
可能存在重复行、主键问题或结构问题。

cwtwac6a

cwtwac6a3#

我也遇到了同样的问题,我意识到我创建了不止一个示例来访问数据库,所以我采取的解决方案是创建一个只能进行一次访问的类。

class SingletonContext {
    private static Context _context;
    public static Context GetInstance() {
        if (_context == null) {
            _context = new Context();
        }
        return _context;
    }
}

每次访问数据库层时,我都会调用GetInstance(),如下所示:

private static Context _context = SingletonContext.GetInstance();
0h4hbjxa

0h4hbjxa4#

在创建post方法时,我也遇到了类似的错误,但我通过执行以下操作解决了这个问题
确保已将以下代码包含在
1.构造函数在此导入中,外键所属的接口文件

  1. HttpPost方法
[HttpPost]
 [ProducesResponseType(204)]
 [ProducesResponseType(400)]
 [ProducesResponseType(404)]

 //IMPORTANT TO INCLUDE [FromQuery]
 public IActionResult CreateBatch([FromQuery] int trackId, 
  [FromBody] BatchDto batchCreate)
 {
     if(batchCreate == null)
         return BadRequest(ModelState);

     var batch = _batchInterface.GetBAtches()
         .Where(c => c.batchName.Trim().ToLower() == 
          batchCreate.batchName
         .TrimEnd().ToLower());

     if (batch == null)
         return BadRequest(ModelState);

     var batchMap = _mapper.Map<Batch>(batchCreate);

     batchMap.track  = _trackInterface.GetTrack(trackId);  //Important

     if (!ModelState.IsValid)
         return BadRequest(ModelState);

     if(!_batchInterface.CreateBatch(batchMap))
     {
         ModelState.AddModelError("", "Something went in the 
         creation of batch");
         return StatusCode(500, ModelState);
     }

     return Ok("Successfully created Batch");

 }

相关问题