我有一个具有递归关系的实体,例如:
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
答案 0 :(得分:1)
这似乎是 ef 核心跟踪问题。如果您在本地或全局添加 AsNoTracking()
到 query
,评论可能会解决问题。
同样,在不改变跟踪行为的情况下,您可以尝试这样的操作:
context.Entry(Message).CurrentValues.SetValues(changed_message_model);