ASP.NET,实体项目的请求不会更新数据库关系

时间:2014-07-14 18:54:39

标签: c# asp.net entity-framework crud

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

看起来像这样,设备组和组用户之间存在多对多关系: http://i.imgur.com/bmIwtiF.jpg

(抱歉,还不能包括身体中的图像)

我通过Visual Studio生成的控制器发出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; }
}

这里输入PutDevice(int id,Device device)方法时Device对象的屏幕截图: http://i.imgur.com/H1oLlk2.jpg

提前致谢!

1 个答案:

答案 0 :(得分:0)

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

  1. 将实体图表重新附加到上下文以便跟踪
  2. 设置图表中每个实体的状态
  3. 在根EntityState实体上设置ModifiedDevice会将对象图中的所有实体附加到上下文中。但是,它会标记具有Unchanged状态的所有子实体。这对应于上面的步骤1.

    要让子实体保留其更改,您需要迭代图形并将更改后的状态设置为Modified,如上面的步骤2所示。

    例如:

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