在 EF Core 中添加或更新实体

时间:2021-01-19 11:05:46

标签: c# database .net-core entity-framework-core

我有一个具有递归关系的实体,例如:

public class Message {
   [Key]
   public int MessageId { get; set; }

   public int? ReplyToMessageId { get; set; }

   public Message ReplyToMessage { get; set; }

   public ICollection<Message> ReplyMessages { get; set; }
}

JSON 数据: { "messages": [ { "id": 1, "reply_to": null, "replied_messages": [ { "id": 2, "reply_to": 1, "replied_messages": [] }, { "id": 3, "reply_to": 1, "replied_messages": [] } ] } ] }

我从 JSON 数据创建消息 (id 1) 和回复消息 (id 2,3,4) 的实例,并将回复 (id 2,3,4) 添加到消息 (id 1) 作为 ReplyMessages,也, message(id 1) 已经存在于数据库中

我需要一个添加或更新方法来保存消息 所以我写了以下代码:

public void AddOrUpdate(Message message) {
  if(Context.Messages.Any(m => m.MessageId == message.MessageId))
    Context.Messages.Update(message);
  else
    Context.Messages.Add(message);
    Context.SaveChanges();
}

当我传递带有一组新回复消息的现有消息时,此方法会出现异常

<块引用>

数据库操作预计会影响 1 行,但实际上影响了 0 行。自加载实体以来,数据可能已被修改或删除。

我测试了 BulkMerge 库的 Entity Framework Extensions 方法,它工作正常,但我正在寻找一个没有任何扩展的具有 ef 核心的解决方案

更多信息:

Database Provider: Postgresql
EF Core Version: 5.0.2

1 个答案:

答案 0 :(得分:1)

这似乎是 ef 核心跟踪问题。如果您在本地或全局添加 AsNoTracking()query,评论可能会解决问题。

同样,在不改变跟踪行为的情况下,您可以尝试这样的操作:

context.Entry(Message).CurrentValues.SetValues(changed_message_model);
相关问题