Vb.net 如何使用实体框架同时更新/插入?

Vb.net 如何使用实体框架同时更新/插入?,vb.net,entity-framework,Vb.net,Entity Framework,如何使用实体框架更新现有客户对象、插入新的计算机对象和添加新的工作订单 Using trans As New System.Transactions.TransactionScope() Using dcLAIT As LAITEntities = New LAITEntities -- Update Customer (Apply existing Customer) vWorkOr

如何使用实体框架更新现有客户对象、插入新的计算机对象和添加新的工作订单

  Using trans As New System.Transactions.TransactionScope()
       Using dcLAIT As LAITEntities = New LAITEntities
                       -- Update Customer (Apply existing Customer)    
                    vWorkOrder.Customer = vCustomer
                       -- Insert Computer 
                    vWorkOrder.Computer = vComputer

                       -- Insert WorkOrder
                    dcLAIT.WorkOrder.AddObject(vWorkOrder)
                    dcLAIT.SaveChanges()
                    trans.Complete()
         End Using
   End Using

调用SaveChanges()时,应执行上下文中所有挂起的更改。但是,在数据库生成唯一ID的情况下,在插入两个新的相关实体时,您可能必须将插入和更新拆分为单独的调用。

您必须单独附加
客户
,并在将其连接到添加的
工单之前设置其状态:

Using trans As New System.Transactions.TransactionScope()
   Using dcLAIT As LAITEntities = New LAITEntities
                   -- Insert Computer 
                vWorkOrder.Computer = vComputer

                   -- Insert WorkOrder
                dcLAIT.WorkOrder.AddObject(vWorkOrder)

                dcLAIT.Customer.Attach(vCustomer)
                   -- Update Customer (Apply existing Customer)    
                dcLAIT.ObjectStateManager.ChangeObjectState(vCustomer, EntityState.Modified)
                vWorkOrder.Customer = vCustomer
                dcLAIT.SaveChanges()
                trans.Complete()
     End Using
 End Using

顺便说一句,
SaveChanges
在内部使用事务,因此除非您想要强制序列化隔离级别,或者您要在该范围内调用多个
SaveChanges
TransactionScope
是冗余的。

客户和计算机对象都具有数据库生成的标识,在插入的情况下,代码可以工作,但如果我想更新一个对象,代码就不能工作。