2011-08-29 80 views
1

如何更新现有的Customer对象,插入新的Computer对象并使用实体框架添加新的WorkOrder?如何使用实体框架同时更新/插入?

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 

回答

2

必须单独装上Customer并设置其状态将其连接到加WorkOrder之前。 SaveChanges在内部使用事务,因此除非您想强制序列化隔离级别,否则您将在该范围内调用多个SaveChangesTransactionScope是冗余的。

0

当您调用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 

+0

Customer和Computer对象都有由数据库生成的标识,如果插入代码有效,但不是如果我想更新其中一个对象。 – arlen