首页 > 解决方案 > 在单个事务中在父子表中插入记录但是当发送多个对象时,我给出了错误实例!无法跟踪实例

问题描述

我得到这个例外:

无法跟踪实体类型“CameraActivity”的实例,因为已经在跟踪另一个具有相同键值的实例 {'ActivityId', 'FeatureId', 'CamId'}。

附加现有实体时,请确保仅附加一个具有给定键值的实体实例。

考虑使用 'DbContextOptionsBuilder.EnableSensitiveDataLogging' 来查看冲突的键值。"}

这是我的 Post 方法

public async Task<ActionResult<Camera>> PostCamera(Camera camera)
{
    var cameraRecodExists = _context.Cameras.FirstOrDefault(C => C.IPAdress == camera.IPAdress) ;

    if (cameraRecodExists !=null)
    {
        return StatusCode(StatusCodes.Status500InternalServerError, new Response { Status = "Error", Message = "Record Already Exists" });
    }
    else
    {
        _context.Cameras.Add(camera);

        // _context.SaveChanges();
        foreach (var activity in camera.CameraActivities)
        {
            activity.CamId = camera.CamId;
            activity.ActivityId = camera.CameraActivities.First().ActivityId;
            activity.FeatureId = camera.CameraActivities.First().FeatureId;
        }

        _context.CameraActivities.AddRange(camera.CameraActivities);

        try 
        {
            await _context.SaveChangesAsync();
        }
        catch(Exception ex)
        {
            var a = ex;
        }

        return CreatedAtAction("GetCamera", new { id = camera.CamId }, camera);
    }
}

标签: c#asp.net-core

解决方案


您可以参考官方文档camera并尝试保存camera.CameraActivities

public async Task<ActionResult<Camera>> PostCamera(Camera camera)
{
    var cameraRecodExists = _context.Cameras.FirstOrDefault(C => C.IPAdress == camera.IPAdress) ;

    if (cameraRecodExists !=null)
    {
        return StatusCode(StatusCodes.Status500InternalServerError, new Response { Status = "Error", Message = "Record Already Exists" });
    }
    else
    {
        _context.Cameras.Add(camera); 
        try 
        {
            await _context.SaveChangesAsync();
        }
        catch(Exception ex)
        {
            var a = ex;
        }

        return CreatedAtAction("GetCamera", new { id = camera.CamId }, camera);
    }
}

推荐阅读