我有一个具有递归关系的实体,例如:
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": [] } ] } ] }
我创建了一个message(id 1)实例,并从JSON数据中回复了message(id 2,3,4),并将回复(id 2,3,4)添加到message(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
看来是ef核心追踪问题。如果您添加AsNoTracking()
到query
本地或全局,则评论可以解决问题。
同样,在不更改跟踪行为的情况下,您可以尝试以下操作:
context.Entry(Message).CurrentValues.SetValues(changed_message_model);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句