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如何更新包含实体列表的实体的主要内容,如果未能解决你的问题,请参考以下文章

如何根据实体框架中的下拉列表选择项填充表单字段以进行更新?

如何更新 EF CF 中的实体对象(分离)?

多对多实体框架和存储库模式插入/更新

如何仅保存/更新父实体而不将其子实体保存在 asp.net mvc 的 EF6 中?

带有 EF Core 更新实体的 ASP.Net 核心 Web Api 如何

EF7 如何处理嵌套实体的更新操作