Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET中,项的实体放置请求不会更新数据库关系_C#_Asp.net_Entity Framework_Crud - Fatal编程技术网

C# ASP.NET中,项的实体放置请求不会更新数据库关系

C# ASP.NET中,项的实体放置请求不会更新数据库关系,c#,asp.net,entity-framework,crud,C#,Asp.net,Entity Framework,Crud,我的模型由三个实体组成:设备、组和用户 看起来是这样的,设备组和组用户之间存在多对多关系: (抱歉,尚未在正文中包含图像) 我通过VisualStudio生成的控制器发出PUT命令 public HttpResponseMessage PutDevice(int id, Device device) { if (!ModelState.IsValid) { return Request.CreateErrorResponse(HttpStatusCode.Bad

我的模型由三个实体组成:设备、组和用户

看起来是这样的,设备组和组用户之间存在多对多关系:

(抱歉,尚未在正文中包含图像)

我通过VisualStudio生成的控制器发出PUT命令

public HttpResponseMessage PutDevice(int id, Device device)
{
    if (!ModelState.IsValid)
    {
        return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
    }
     if (id != device.DeviceId)
    {
        return Request.CreateResponse(HttpStatusCode.BadRequest);
    }
     db.Entry(device).State = EntityState.Modified;
    try
    {
        db.SaveChanges();
    }
    catch (DbUpdateConcurrencyException ex)
    {
        return Request.CreateErrorResponse(HttpStatusCode.NotFound, ex);
    }
     return Request.CreateResponse(HttpStatusCode.OK);
}
当我更改简单属性(如名称或描述)时,实体更新似乎进展顺利。 但是,我的问题是,当我尝试更改设备中的组时,数据库似乎没有更新。 我的印象是EF的全部目的是自动管理多对多关系中的隐含变化。我是否必须明确地采取额外的步骤

设备型号如下所示:

public partial class Device
{
    public Device()
    {
        this.Groups = new HashSet<Group>();
    }

    public int DeviceId { get; set; }
    public string Name { get; set; }
    public int Number { get; set; }
    public string IpAddress { get; set; }
    public string Version { get; set; }
    public string Description { get; set; }

    public virtual ICollection<Group> Groups { get; set; }
}
公共部分类设备
{
公共设备()
{
this.Groups=newhashset();
}
公共int设备ID{get;set;}
公共字符串名称{get;set;}
公共整数{get;set;}
公共字符串IpAddress{get;set;}
公共字符串版本{get;set;}
公共字符串说明{get;set;}
公共虚拟ICollection组{get;set;}
}
这里是输入PutDevice(int-id,Device-Device)方法时设备对象的屏幕截图:


提前谢谢

在断开连接的场景中重新连接实体有两个步骤:

  • 将实体图重新附加到上下文,以便对其进行跟踪
  • 设置图形中每个实体的状态
  • 将根
    设备
    实体上的
    实体状态
    设置为
    已修改
    ,将把对象图中的所有实体附加到上下文中。但是,它会将所有子实体标记为
    未更改
    状态。这与上面的步骤1相对应

    要使子实体保持其更改,您需要在图形上迭代,并按照上面的步骤2将更改状态设置为
    Modified

    例如:

    context.Entry(device.Group).State = EntityState.Modified
    

    在调试器中,我没有得到任何错误,它返回HttpStatusCode.OK。传递给PutDevice()的设备内容在我问题末尾的屏幕截图上可见。但是,当我调用GetDevices()时,设备仍然有与之关联的旧组。