当前位置: 首页 > 知识库问答 >
问题:

ef core已跟踪具有相同id的实体

孟乐逸
2023-03-14

我想不出如何摆脱这个错误:

无法跟踪实体类型“Relations”的实例,因为已在跟踪键值为“{id:26}”的另一个实例。附加现有实体时,确保只附加一个具有给定键值的实体实例。

我尝试将实体从上下文中分离出来,但即使这样也不能阻止这个错误的发生。有人能给我指出我做错了什么吗?

服务

    private async Task<int> EditAsync(RelationModel model)
    {
        RelationEntity entity = _mapper.ToEntity(model);
        RelationEntity oldRelation = await _relationRepository.GetRelationAsync(entity.Id);
        _relationRepository.UpdateRelation(oldRelation, entity);
        await _relationRepository.SaveAsync();
        return entity.Id;
    }

存储

    public void UpdateRelation(Relation oldRelation, Relation relation)
    {
        if (oldRelation != null)
        {
            // Detach
            Context.Entry(oldRelation).State = EntityState.Detached;

            // Delete childs
            if (oldRelation.Person != null && relation.Person == null)
            {
                Context.Persons.Remove(oldRelation.Person);
            }

            if (oldRelation.Customer != null && relation.Customer == null)
            {
                Context.Customers.Remove(oldRelation.Customer);
            }

            if (oldRelation.Supplier != null && relation.Supplier == null)
            {
                Context.Suppliers.Remove(oldRelation.Supplier);
            }

            if (oldRelation.Employee != null && relation.Employee == null)
            {
                Context.Employees.Remove(oldRelation.Employee);
            }

            // Update parent
            Context.Relations.Update(relation); // <-- error occurs
        }
    }

关系实体

public class Relation : BaseEntity<int>
{
    public string Code { get; set; }

    public int? PersonId { get; set; }
    public Person Person { get; set; }

    public int? CompanyId { get; set; }
    public Company Company { get; set; }

    public int? CustomerId { get; set; }
    public Customer Customer { get; set; }

    public int? SupplierId { get; set; }
    public Supplier Supplier { get; set; }

    public int? EmployeeId { get; set; }
    public Employee Employee { get; set; }

    public ICollection<RelationRelations> ParentRelations { get; set; }
    public ICollection<RelationRelations> ContactPersons { get; set; }
    public ICollection<RelationContactMethod> ContactMethods { get; set; }
    public ICollection<RelationAddress> Addresses { get; set; }
}

更新

我试着替换

Context.Relations.Update(relation); 

Context.Entry(oldRelation).CurrentValues.SetValues(relation);

但关系实体上的任何属性都不会更新。

共有1个答案

马奇略
2023-03-14

我使用这个代码而不是“update”,很多年了,所有的东西都被正确地更新了,我从来没有出现过任何错误。

替换

 Context.Relations.Update(relation); 

Context.Entry(oldRelation).CurrentValues.SetValues(relation);
 类似资料:
  • 问题内容: 很抱歉,我只学习了PHP和MySQL,已经搜索了一个多星期,但是没有找到任何答案。 我创建了一个简单的财务脚本,该表如下所示: 我想要这样的结果 有人可以帮助我解决我的问题吗? 谢谢 问题答案: 正如@Quassnoi指出的那样,这对于MySQL来说不是很有效。我尝试使用怪胎连接而不是子查询,因为内部查询本身就可以使用。 编辑 对此引起了一些兴趣,发现连接版本的速度是@Quassnoi

  • 我希望为每个请求生成唯一的traceId,并将其传递给所有服务。在SpringMVC中,使用MDC上下文并将traceId放在头文件中相当容易,但在反应式堆栈中,由于ThreadLocal,它根本不起作用。 一般来说,我希望使用单个traceId记录我拥有的每个服务上的每个请求和响应,该traceId可以识别整个系统中的特定操作。 我试图根据文章创建自定义过滤器:https://azizulhaq

  • 目前,我有一个类分数,它允许我用三种不同的方式创建分数 对于一个整数,在这种情况下,给定的整数将是分子,分母将设置为1 有2个整数,分子和分母 最后一种方法是解析一个字符串,该字符串必须与REGEX-?\d/[1-9]\d* gcd将尽可能减少生成的分数。 我现在想实现的是,具有相同分子和分母的分数实例具有相同的引用例如。 应该返回true。 我研究了一些关于泛型和边界的章节,但我不确定这是否是我

  • 在我的身体里我有3

  • 我使用Kafka来实现微服务之间的呼叫同步,并使用SpringSleuth进行日志记录。日志记录是可以的,但是当有一条消息从MicroService 1发送到MicroService 2时,日志记录的消息具有不同的跟踪ID。它们不是必须具有相同的跟踪ID但具有不同的SpanId吗?是否有任何特殊配置?

  • 我是Kafka的初学者。我知道具有相同组id的多个消费者不能在一个主题中使用来自同一个分区的消息。我想知道如果来自一个消费组的多个Kafka消费者从一个分区读取相同的消息会发生什么,为什么这是一件坏事。 。