EF如何更新包含实体列表的实体
Posted
技术标签:
【中文标题】EF如何更新包含实体列表的实体【英文标题】:EF how to update entity containing the List of entities 【发布时间】:2016-02-01 06:40:17 【问题描述】:我有一个类 Device 如下。
public class Device
public string id get; set;
public string name get; set;
public List<Instructions> Instructions get; set;
现在我有一个视图,其中包含与设备相关的部分以及向设备添加指令的规定。
如果设备是新的,那么this.context.Devices.Add(device)
工作正常。
但如果我想编辑设备。我是通过 ID 找到的。它是人口稠密的。如果我更改单个属性,那么它运行良好。但我想立即更新整个设备,但没有发生。
我的示例代码如下。
public async Task<bool> AddInstrument(Device device)
try
var newDevice = this.context.Device
.Where(i => i.Id == device.Id).FirstOrDefault();// i tried find,single or default also
//adding new device
if (newDevice == null)
this.context.Device.Add(device);
return await this.context.SaveChangesAsync() > 0;
//if editing the device
newDevice = device;
return await this.context.SaveChangesAsync() > 0;
catch
throw;
我想要达到的目标。
问题:- 我想更新数据库中的相应设备。连同说明。 例如以前名为“D22”的设备有 3 条指令(a1、a2、a3)。
但现在同一设备的值名称为“D22_1”,现在指令为 a1、a3(更新任何字段)、a2(已删除)。添加了 b1 和 a4,因此在编辑字段后,我将 Instructions as a1,a2,b1,b4 for D22_1 。
我的努力:-
我尝试过的。
1) 对于主设备 D22,如果我明确指定属性,则可以,例如
device.Name="aaaaa";
this.context.savechanges();
在数据库中反映它。我还没有尝试过更新列表中的说明。
2)我尝试使用
this.context.Entry(device).State = EntityState.Modified;
但经过各种打击和试验,我无法运行它。我能得到的最好的结果是这个错误“如果图中的任何实体具有冲突的键值,则在使用“附加”方法或将实体的状态设置为“未更改”或“已修改”时,可能会发生这种情况。这可能是因为某些实体是新的,尚未收到..”
请给我一些建议。此外,我想了解与在 EF 中使用列表更新条目相关的各种技术。我假设 EF 会自动处理子对象(即添加/更新和删除)。 在我的情况下,设备说明。
【问题讨论】:
This post 展示了如何更新实体的集合。基本上,它遍历集合中的项目并处理可能发生的三种情况 - 添加项目、更新项目、删除项目。 newDevice = 设备;这就是问题所在:newDevice 在上下文中,而 device 不在。由于您将引用设置为另一个值,因此 EF 无法再跟踪它。您必须一一设置属性或在分离的场景中工作。 @DevilSuichiro 我该怎么做?在分离场景中工作 【参考方案1】:试试这个:
this.context.Attach(device);
this.context.Entry(device).State = EntityState.Modified;
this.context.SaveChangesAsync();
【讨论】:
我收到此错误。附加类型为“设备”的实体失败,因为同一类型的另一个实体已经具有相同的主键值。如果图中的任何实体具有冲突的键值,则在使用“附加”方法或将实体的状态设置为“未更改”或“已修改”时,可能会发生这种情况。这可能是因为某些实体是新实体,尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“已添加”实体状态来跟踪图形,然后将非新实体的状态设置为“未更改”或“已修改”。 我试过这个:-this.context.Device.Attach(newDevice);新设备=设备; this.context.Entry(newDevice).State = System.Data.Entity.EntityState.Modified;以上是关于EF如何更新包含实体列表的实体的主要内容,如果未能解决你的问题,请参考以下文章
如何仅保存/更新父实体而不将其子实体保存在 asp.net mvc 的 EF6 中?