用相同的密钥对象已存在于objectstatemanager。 [英] Object with same key already exists in objectstatemanager.

查看:101
本文介绍了用相同的密钥对象已存在于objectstatemanager。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我收到以下错误而使用实体框架更新两个表 -


  

使用相同的密钥对象已存在于objectstatemanager。现有的对象是在改性状态。一个对象只能加入到再次objectstatemanager如果它是在加入状态


我的code

 公共无效UpdatePaymentTransaction(PaymentTransaction paymentTransaction)
    {
        使用(VAR上下文= DataObjectFactory.CreateContext())
        {
            VAR实体= 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​​(实体);
            context.SaveChanges();            如果(paymentTransaction.PaymentGatewayOrderId!= NULL)
            {
                PaymentTransactionContractEntity paymentTransactionContractEntity =新PaymentTransactionContractEntity();
                字符串[] = contractIds paymentTransaction.PaymentGatewayOrderId.Split(' - ');                的foreach(在contractIds VAR contractId)
                {
                    paymentTransactionContractEntity.PaymentTransactionId = entity.Id;
                    paymentTransactionContractEntity.ContractId = Convert.ToInt32(contractId);
                    context.PaymentTransactionContractEntities.AddObject(paymentTransactionContractEntity);
                    context.SaveChanges();
                }
            }
        }
    }


解决方案

试试这个:

 公共无效UpdatePaymentTransaction(PaymentTransaction paymentTransaction)
{
    使用(VAR上下文= DataObjectFactory.CreateContext())
    {
        VAR实体= 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;        //无论是使用previous为行或下一行。两者不需要
        //context.PaymentTransactionEntities.ApplyCurrentValues​​(entity);
        context.SaveChanges();        如果(paymentTransaction.PaymentGatewayOrderId!= NULL)
        {
            字符串[] = contractIds paymentTransaction.PaymentGatewayOrderId.Split(' - ');            的foreach(在contractIds VAR contractId)
            {
                // for each循环否则只能先合同创建新实例
                //被认为是插入,只有所有后续的合同修改
                //第一个=原因你的异常
                PaymentTransactionContractEntity paymentTransactionContractEntity =新PaymentTransactionContractEntity();                paymentTransactionContractEntity.PaymentTransactionId = entity.Id;
                paymentTransactionContractEntity.ContractId = Convert.ToInt32(contractId);
                context.PaymentTransactionContractEntities.AddObject(paymentTransactionContractEntity);
                context.SaveChanges();
            }
        }
    }
}

I'm getting below error while updating two tables using entity framework -

Object with same key already exists in objectstatemanager. The existing object is in the modified state. An object can only added to objectstatemanager again if it is in added state

My code

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

解决方案

Try this instead:

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

这篇关于用相同的密钥对象已存在于objectstatemanager。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆