Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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# 将另一个上下文中的实体添加到上下文中,并附加现有的对象图实体,以避免重复_C#_Entity Framework_Ef Code First_Entity Framework 4.3.1 - Fatal编程技术网

C# 将另一个上下文中的实体添加到上下文中,并附加现有的对象图实体,以避免重复

C# 将另一个上下文中的实体添加到上下文中,并附加现有的对象图实体,以避免重复,c#,entity-framework,ef-code-first,entity-framework-4.3.1,C#,Entity Framework,Ef Code First,Entity Framework 4.3.1,我有一个方法,可以创建一个新实体,其中包含一个非常复杂的对象图,其中可能包含也可能不包含现有实体。该方法管理自己的上下文。它返回在另一个类上的方法中使用的实体,该类维护自己的上下文并尝试添加该实体 分工的原因是,第二种方法进行了一系列处理,这在几个不同的实体创建场景中是通用的。我不想在第一种方法中保存实体,因为在将实体保存到数据库之前,第二种方法必须成功 问题在于,当第二个上下文添加实体时,它将整个对象图视为全新的,并在数据库中创建重复项 将实体添加到第二个上下文并使其对象图中的所有现有实体都连

我有一个方法,可以创建一个新实体,其中包含一个非常复杂的对象图,其中可能包含也可能不包含现有实体。该方法管理自己的上下文。它返回在另一个类上的方法中使用的实体,该类维护自己的上下文并尝试添加该实体

分工的原因是,第二种方法进行了一系列处理,这在几个不同的实体创建场景中是通用的。我不想在第一种方法中保存实体,因为在将实体保存到数据库之前,第二种方法必须成功

问题在于,当第二个上下文添加实体时,它将整个对象图视为全新的,并在数据库中创建重复项

将实体添加到第二个上下文并使其对象图中的所有现有实体都连接起来的最佳方法是什么?


我试图避免像遍历对象图和测试IDs>0这样的操作

如果“一系列处理”失败,只需不调用
SaveChanges
,就不会向数据库写入任何内容。你不能那样做吗?当您处理第一个上下文并尝试在新上下文中保存对象图时,您已经丢失了有关提供给第一个上下文的实体状态的所有信息。如果您不想再次恢复所有实体状态信息,您希望EF查看水晶球。没有魔法可用。要么在第二个上下文中再次努力工作,要么尽量避免两个上下文,最好是后一种解决方案。最初我使用一个上下文并在方法之间传递它。但是后来我改变了它,第一个方法可以并行运行。所以我不想传递上下文,因为它不是线程安全的。关于您的第一点,当您说“不要调用SaveChanges”时,您的意思是在第一个方法中调用它之后?我希望这是一个全有或全无的交易。您可以将两个
SaveChanges
调用包装到
TransactionScope
中。只有在提交范围时,两个
SaveChanges
发送到DB的更改才会实际写入DB。否则两者都将回滚。它如何跟踪哪些上下文是范围的一部分?我是否必须在TransactionScope完成后执行悲观保存,然后接受更改?我认为
TransactionScope
不知道上下文是什么。创建作用域实例将在数据库级别启动事务。提交或处理它将结束事务。由
SaveChanges
(无论哪个上下文)发出的每个数据库命令都是该外部事务的一部分。但是关于调用
AcceptChanges
的好问题。我不确定正确的方法。如果仍然在作用域之后处理上下文,无论是否出现故障,您都可以使用默认的
SaveChanges
立即接受。