首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用子记录列表保存记录时发生EntityFramework错误

使用子记录列表保存记录时发生EntityFramework错误
EN

Stack Overflow用户
提问于 2020-05-25 16:39:08
回答 1查看 287关注 0票数 0

在我的ASP.NET核心,我们使用EF核心。当保存具有子记录列表的记录时,我们会得到以下错误:

无法跟踪实体类型Child的实例,因为另一个具有{'Id'}键值相同的实例已经被跟踪。

一步步地:

  1. 从控制器获取记录并将其传递给视图(视图有a)、
  2. 、通过html表单
  3. 更新一些属性、单击在控制器保存方法中传递的保存
  4. 捕获模型。从DB获取原始项并保存更改(通过表单进行)
  5. 调用更新/保存在存储库

简化代码如下:

代码语言:javascript
复制
// Get the record from the database
var record = _dbContext.Parents
    .Include(x => p.SomeOtherObject)
    .Include(x => x.ListChildren)
    .FirstOrDefault(x => x.IdParent == id);

// then we do some changes to Parent and ListChildren
// we do not do any changes to SomeOtherObject!!!

// save changes
_dbContext.Update(record);
_dbContext.SaveChanges();

// definition of entities
public class Parent
{
    public int IdParent { get; set; }
    public string Name {get; set;}
    public string Surname {get; set;}

    public int IdSomeOtherObject { get; set; }
    [ForeignKey("IdSomeOtherObject")]
    public virtual SomeOtherObject SomeOtherObject { get; set; }

    public virtual List<Child> ListChildren { get; set; }
}

public class Child
{
    public int IdChild { get; set; }
    public int IdParent { get; set;}
    public string Name { get; set; }
}

public class SomeOtherObject
{
    public int IdSomeOtherObject { get; set; }
    public string PropertiesBlahBla { get; set; }
}

现在,我知道我们可以将.AsNoTracking()添加到Get操作中,但问题是,当保存Parent时,EntityFramework将执行和UPDATE SQL语句,甚至对于SomeOtherObject (没有以任何方式更改),这对于我们的数据/输入场景来说是不可接受的。

还有其他方法来传递这个错误吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-25 17:16:55

尝试删除_dbContext.Update(record);。您的实体应该已经被跟踪,所以应该保存更改。

Update docs所述:

默认情况下,

使用修改后的状态开始跟踪可从给定实体访问的给定实体和条目。

因此,在这种情况下,它似乎是不必要的。

UPD

在chat的讨论中,发现子跟踪集合被替换如下:

代码语言:javascript
复制
record.ListChildren = someModel.ListChildren.Where(...).ToList()

这导致添加了具有已跟踪ids的元素。因此,ListChildren应该通过保存已经跟踪的项目来更新,比如推荐的here

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62006837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档