Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.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
如何在linq中删除和重新插入实体?_Linq_Linq To Sql_Insert_Submit - Fatal编程技术网

如何在linq中删除和重新插入实体?

如何在linq中删除和重新插入实体?,linq,linq-to-sql,insert,submit,Linq,Linq To Sql,Insert,Submit,我在删除实体(未提交更改)后在linq中插入实体时遇到问题 List alergiesperson=alergiespersontoinsert; RepositoryFactory.GetAlergiesPersonRepository().DeleteWhere(x=>x.PersonId==id); RepositoryFactory.GetAlergiesPersonRepository().Insert(AlergiesPerson); DataContextFactory.Submi

我在删除实体(未提交更改)后在linq中插入实体时遇到问题

List alergiesperson=alergiespersontoinsert;
RepositoryFactory.GetAlergiesPersonRepository().DeleteWhere(x=>x.PersonId==id);
RepositoryFactory.GetAlergiesPersonRepository().Insert(AlergiesPerson);
DataContextFactory.SubmitChanges();
两者(删除和插入)均不提交任何更改。他们只是插入AllonSubmit和删除AllonSubmit


该代码第一次运行良好。所有细节都已正确插入。第二次运行相同的代码时,数据库的所有行都被删除。第三次,一切正常。它可以工作,也可以不工作,依此类推。

我认为您必须重新创建详细信息。
即使尚未调用“保存更改”,上下文当前仍将此项目跟踪为“已删除”。

存在一些棘手的问题。由于您希望摆脱DataContext observer,因此需要:

  • 将对象或图形序列化到内存 小溪
  • 然后将其反序列化为新实例
  • 将ID更改为0
  • 将新对象附加到DataContext并提交 变化
  • 删除以前的
  • 您可以将其移动到CloneHelper静态类,以便可以将其用于任何类型

    ...DeleteWhere(x => x.PersonId == id); 
    DataContextFactory.SubmitChanges();
    
    ...Insert(AlergiesPerPerson);
    DataContextFactory.SubmitChanges();
    

    没有理由说每个工作单元只需提交一次更改。请注意,这仍然适用于您拥有的任何事务。

    我每次(其他实例)都会重新创建details对象,但内容是相同的。linq是否按顺序执行命令?我的意思是:首先执行所有删除操作,然后执行所有插入操作?对象是新实例。每次我访问db时,都会将linq对象转换为另一个实体对象。基本上,我将每个属性从一边复制粘贴到另一边。因此,要插入的对象不是datacontext引用的对象。没有身份证,我改为细节只是为了举例,但真正的事情是这样的:AlergieSperson,我有人名和alergyId。我想当你做提交更改时,所有的工作都“一次”完成了。这就是为什么我只做了一个。所以你认为我应该用TransacionScope把整件事都包起来?@Marco当你打电话给SubmitChanges时,所有未决的工作都完成了,但打电话后你可以做得更多。如果您认为最好的话,您可以将工作包装在事务范围中;这并不困难,也可能是有益的。但是,如果您不需要该事务,我就不麻烦了。那么,如果出于性能原因,我希望这些更改一起生效,该怎么办?上面的代码不会导致对数据库的两次往返而不是一次吗?@PatrickSzalapski当您调用
    SubmitChanges
    时,您告诉datacontext执行任何挂起的SQL查询;如果在有多个挂起的查询时调用它,那么它们将“一起生效”。不可能在一条语句中编写插入和删除的查询!在这种情况下,insert和delete查询将作为单个连接或上下文中的两个查询发送,就像在SQL Management Studio中内联编写两个查询一样。LINQtoSQL确实有性能方面的考虑,但我不认为这是其中之一。
    ...DeleteWhere(x => x.PersonId == id); 
    DataContextFactory.SubmitChanges();
    
    ...Insert(AlergiesPerPerson);
    DataContextFactory.SubmitChanges();