【问题标题】:Object with same key already exists in objectstatemanager.objectstatemanager 中已存在具有相同键的对象。
【发布时间】:2011-11-24 09:37:52
【问题描述】:

我在使用实体框架更新两个表时遇到错误 -

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();
                }
            }
        }
    }

【问题讨论】:

    标签: asp.net-mvc-3 entity-framework


    【解决方案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();
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      相关资源
      最近更新 更多