Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在EF Core中添加或更新实体_C#_Database_.net Core_Entity Framework Core - Fatal编程技术网

C# 在EF Core中添加或更新实体

C# 在EF Core中添加或更新实体,c#,database,.net-core,entity-framework-core,C#,Database,.net Core,Entity Framework Core,我有一个具有递归关系的实体,如: 公共类消息{ [关键] public int MessageId{get;set;} 公共int?ReplyToMessageId{get;set;} 公共消息ReplyToMessage{get;set;} 公共ICollection ReplyMessages{get;set;} } JSON数据: {“消息”:[{“id”:1,“reply_to”:null,“reply_messages”:[{“id”:2,“reply_to”:1,“reply_me

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

公共类消息{
[关键]
public int MessageId{get;set;}
公共int?ReplyToMessageId{get;set;}
公共消息ReplyToMessage{get;set;}
公共ICollection ReplyMessages{get;set;}
}
JSON数据:
{“消息”:[{“id”:1,“reply_to”:null,“reply_messages”:[{“id”:2,“reply_to”:1,“reply_messages”:[]},{“id”:3,“reply_to”:1,“reply_messages”:[]}]}

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

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

public void addor更新(消息){
if(Context.Messages.Any(m=>m.MessageId==message.MessageId))
Context.Messages.Update(message);
其他的
Context.Messages.Add(消息);
SaveChanges();
}
当我传递一个包含新回复消息集合的现有消息时,此方法会产生异常

数据库操作预期影响1行,但实际影响0行。自加载实体后,数据可能已被修改或删除

我测试了
BulkMerge
方法的
实体框架扩展
库,它的工作很好,但我正在寻找一个没有任何扩展的ef核心解决方案

更多信息:

Database Provider: Postgresql
EF Core Version: 5.0.2

这似乎是ef核心跟踪问题。如果将
AsNoTracking()
添加到
query
本地或全局,则注释可能会解决此问题

在不改变跟踪行为的情况下,您也可以尝试以下方法:

context.Entry(Message).CurrentValues.SetValues(changed_message_model);

您能否显示消息在
AddOrUpdate
之前是如何初始化的?您能否也显示异常?您能否显示一个json示例?提供程序是什么?MySql?FYI
Context.Messages.Update
已经具有添加或更新功能。你没必要做出区分。此外,请始终在问题中添加新信息,而不是作为注释,并请标记您正在使用的EF版本。@alireza如果看不到跟踪行为适用的代码,这完全没有意义。更可能的情况是,您的上下文生命周期管理不正确,是时候解决这个问题了,而不是通过禁用跟踪应用糟糕的补丁。下次保存同一封邮件时,您可能会再次遇到此错误。@GertArnold我使用AsNoTracking时显示的问题,我不是说禁用跟踪,它意味着如果禁用跟踪,您会造成此问题,那么答案就不是很清楚了。不管怎么说,这是一个远大的希望。您的代码不会透露您如何创建完整的往返数据库客户机数据库。JSON表明这是一种断开连接的情况,在这种情况下,跟踪在往返中不起作用,并且如果您确实具有推荐的短期上下文,则必须先从数据库中重新获取实体,才能完成
SetValues