objectstatemanager中已存在具有相同键的对象。

时间:2011-11-24 09:37:53

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

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

  

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 个答案:

答案 0 :(得分: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();
            }
        }
    }
}
相关问题