2011-11-24 51 views
0

我收到以下错误,同时更新使用实体框架的两个表 -对象状态管理器中已存在具有相同密钥的对象。

对象有相同的密钥在objectstatemanager已经存在。现有对象处于修改状态。一个对象只能添加到再次objectstatemanager如果是在加国

我的代码

public void UpdatePaymentTransaction(PaymentTransaction paymentTransaction) 
    { 
     using (var context = DataObjectFactory.CreateContext()) 
     { 
      var entity = context.PaymentTransactionEntities.Where(c => c.Id == paymentTransaction.Id).SingleOrDefault(); 

       entity.PartyId = paymentTransaction.PartyId;     
       entity.TotalAmount = paymentTransaction.TotalAmount;     
       entity.RequestDate = paymentTransaction.RequestDate;     
       entity.ResponseDate = paymentTransaction.ResponseDate; 

      context.PaymentTransactionEntities.ApplyCurrentValues(entity); 
      context.SaveChanges(); 

      if (paymentTransaction.PaymentGatewayOrderId != null) 
      { 
       PaymentTransactionContractEntity paymentTransactionContractEntity = new PaymentTransactionContractEntity(); 
       string[] contractIds = paymentTransaction.PaymentGatewayOrderId.Split('-'); 

       foreach (var contractId in contractIds) 
       { 
        paymentTransactionContractEntity.PaymentTransactionId = entity.Id; 
        paymentTransactionContractEntity.ContractId = Convert.ToInt32(contractId); 
        context.PaymentTransactionContractEntities.AddObject(paymentTransactionContractEntity); 
        context.SaveChanges(); 
       } 
      } 
     } 
    } 

回答

1

试试这个:

public void UpdatePaymentTransaction(PaymentTransaction paymentTransaction) 
{ 
    using (var context = DataObjectFactory.CreateContext()) 
    { 
     var entity = context.PaymentTransactionEntities.Where(c => c.Id == paymentTransaction.Id).SingleOrDefault(); 

     entity.PartyId = paymentTransaction.PartyId;     
     entity.TotalAmount = paymentTransaction.TotalAmount;     
     entity.RequestDate = paymentTransaction.RequestDate;     
     entity.ResponseDate = paymentTransaction.ResponseDate; 

     // Either use previous for rows or following row. Both are not needed 
     //context.PaymentTransactionEntities.ApplyCurrentValues(entity); 
     context.SaveChanges(); 

     if (paymentTransaction.PaymentGatewayOrderId != null) 
     { 
      string[] contractIds = paymentTransaction.PaymentGatewayOrderId.Split('-'); 

      foreach (var contractId in contractIds) 
      { 
       // Create new instance for each loop otherwise only first contract 
       // is considered as insert and all following contracts only modifies 
       // the first one = reason for your exception 
       PaymentTransactionContractEntity paymentTransactionContractEntity = new PaymentTransactionContractEntity(); 

       paymentTransactionContractEntity.PaymentTransactionId = entity.Id; 
       paymentTransactionContractEntity.ContractId = Convert.ToInt32(contractId); 
       context.PaymentTransactionContractEntities.AddObject(paymentTransactionContractEntity); 
       context.SaveChanges(); 
      } 
     } 
    } 
} 
相关问题