我的模型由三个实体组成:设备,组和用户。
看起来像这样,设备组和组用户之间存在多对多关系: 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
提前致谢!
答案 0 :(得分:0)
在断开连接的场景中重新连接实体有两个步骤:
在根EntityState
实体上设置Modified
到Device
会将对象图中的所有实体附加到上下文中。但是,它会标记具有Unchanged
状态的所有子实体。这对应于上面的步骤1.
要让子实体保留其更改,您需要迭代图形并将更改后的状态设置为Modified
,如上面的步骤2所示。
例如:
context.Entry(device.Group).State = EntityState.Modified