0

我有一个列表,这个列表正在通过循环填充。每个循环都直接从 DB 获取一个集合。问题是,当它获得列表中存在相同 CaseNo 的 CaseNo(PK) 并且我更改了其中一个属性的值时,列表中已经存在的具有相同 CaseNo 的项目也会更改。

前任。案例编号 1234,过程代码 = OTH

然后我添加另一个我从数据库中获得的项目。但这次我以编程方式更改 proc 代码,上面列表中的项目也更改为该值。我不希望这种情况发生,因为它在记录中不是同一个案例,因为案例可以有不同类型的专业代码作为其类别。

我知道它正在发生变化,因为它检测到它与列表中的项目相同,但我需要在列表中添加相同的案例编号作为单独的项目,因为 proc 代码不同。有没有一种方法可以将其视为与列表中的实体不同的实体?

前任。数据 1.)CaseNO 123 Proc code OTH 2.) CaseNO 123 Proc code OTH

但我需要它是: 1.)CaseNO 123 Proc 代码 DSP 1.)CaseNO 123 Proc 代码 OTH

执行此行时出错。

adrCase.ProcCode = "DSP";

然后列表中的项目(_adrMasterList)如果有任何相同的情况下,也将其过程代码更改为“DSP”。

这是我的代码:

 private void GenerateReport(string caseCoordinatorID)  //LGF 08012011 ADR-59: add case coordinator - add parameter
    {
        var dispositions = FileMaintenanceBusiness.Instance.GetManyDispositionInfobyKeyword(_selectedProcCode, "ProcCode");
        var adrDispos = FileMaintenanceBusiness.Instance.GetAllADRDispositionInfoList();

        var calendarActivities = FileMaintenanceBusiness.Instance.GetManyCalendarActivityInfobyKeyword(_selectedProcCode, "ProcCode");
        var adrCalActivities = FileMaintenanceBusiness.Instance.GetAllADRCalendars();

        var otherActivities = FileMaintenanceBusiness.Instance.GetManyOtherActivities(_selectedProcCode, "ProcCode");
        var adrOtherActivities = FileMaintenanceBusiness.Instance.GetAllADROtherActivities();
        _adrMasterList.Clear();

        if (_selectedProcCode == "ALL")
        {
            var dispositionALL = FileMaintenanceBusiness.Instance.GetAllDispositionInfoList();
            var adrDisposALL = FileMaintenanceBusiness.Instance.GetAllADRDispositionInfoList();

            var calendarActivitiesALL = FileMaintenanceBusiness.Instance.GetAllCalendarActivityInfoList();
            var adrCalActivitiesALL = FileMaintenanceBusiness.Instance.GetAllADRCalendars();

            var otherActivitiesALL = FileMaintenanceBusiness.Instance.GetAllOtherActivities();
            var adrOtherActivitiesALL = FileMaintenanceBusiness.Instance.GetAllADROtherActivities();

            if (dispositionALL != null && adrDisposALL != null)//dispos
            {
                foreach (var dispo in dispositionALL)
                {
                    foreach (var adrDispo in adrDisposALL)
                    {
                        if (dispo.DispositionID == adrDispo.DispositionID)
                        {
                            var adrCase = FileMaintenanceBusiness.Instance.GetADRMasterInfobyKeyword(adrDispo.CaseNo, "CaseNo");
                            if (adrCase != null)
                            {

                                adrCase.ProcCode = "DSP";
                                adrCase.ProcDateString = dispo.ProcDate.HasValue ? dispo.ProcDate.Value.ToShortDateString() : string.Empty;
                                //LGF 08012011 ADR-59: add case coordinator - add CaseCoordinatorFilter
                                //if (!_adrMasterList.Contains(adrCase) && CaseCoordinatorFilter(caseCoordinatorID, adrCase.CaseNo))  
                                //    _adrMasterList.Add(adrCase);
                                if (CaseCoordinatorFilter(caseCoordinatorID, adrCase.CaseNo))
                                    _adrMasterList.Add(adrCase);
                            }
                        }
                    }
                }
            }

            if (calendarActivitiesALL != null && adrCalActivitiesALL != null)//cals
            {
                foreach (var cal in calendarActivitiesALL)
                {
                    foreach (var adrCal in adrCalActivitiesALL)
                    {
                        if (cal.CalendarItemID == adrCal.CalendarItemID)
                        {
                            var adrCase = FileMaintenanceBusiness.Instance.GetADRMasterInfobyKeyword(adrCal.CaseNo, "CaseNo");
                            if (adrCase != null)
                            {
                                adrCase.ProcCode = "CAL";
                                adrCase.ProcDateString = cal.ProcDate.ToShortDateString();
                                //LGF 08012011 ADR-59: add case coordinator - add CaseCoordinatorFilter
                                //if (!_adrMasterList.Contains(adrCase) && CaseCoordinatorFilter(caseCoordinatorID, adrCase.CaseNo))
                                //    _adrMasterList.Add(adrCase);
                                if (CaseCoordinatorFilter(caseCoordinatorID, adrCase.CaseNo))
                                    _adrMasterList.Add(adrCase);
                            }
                        }
                    }
                }
            }
            if (otherActivitiesALL != null && adrOtherActivitiesALL != null)//other activities
            {

                foreach (var otherActivity in otherActivitiesALL)
                {
                    foreach (var adrotherActivity in adrOtherActivitiesALL)
                    {
                        if (otherActivity.ActivityID == adrotherActivity.ActivityID)
                        {
                            var adrCase = FileMaintenanceBusiness.Instance.GetADRMasterInfobyKeyword(adrotherActivity.CaseNo, "CaseNo");
                            if (adrCase != null)
                            {
                                adrCase.ProcCode = otherActivity.ProcCode;
                                adrCase.ProcDateString = otherActivity.ProcDate.ToShortDateString();
                                //LGF 08012011 ADR-59: add case coordinator - add CaseCoordinatorFilter
                                //if (!_adrMasterList.Contains(adrCase) && CaseCoordinatorFilter(caseCoordinatorID, adrCase.CaseNo))
                                if(CaseCoordinatorFilter(caseCoordinatorID, adrCase.CaseNo))
                                    _adrMasterList.Add(adrCase);
                            }
                        }
                    }
                }
            }



        }
        else if (_selectedProcCode == "DSP")
        {
            if (dispositions != null && adrDispos != null)
            {
                foreach (var dispo in dispositions)
                {
                    foreach (var adrDispo in adrDispos)
                    {
                        if (dispo.DispositionID == adrDispo.DispositionID)
                        {
                            var adrCase = FileMaintenanceBusiness.Instance.GetADRMasterInfobyKeyword(adrDispo.CaseNo, "CaseNo");
                            //LGF 08012011 ADR-59: add case coordinator - add CaseCoordinatorFilter
                            if (adrCase != null && CaseCoordinatorFilter(caseCoordinatorID, adrCase.CaseNo))
                            {
                                adrCase.ProcCode = _selectedProcCode;
                                //adrCase.ProcDateString = dispo.ProcDate.ToShortDateString();
                                _adrMasterList.Add(adrCase);
                            }
                        }
                    }
                }
            }
        }
        else if (_selectedProcCode == "CAL")
        {
            if (calendarActivities != null && adrCalActivities != null)
            {
                foreach (var cal in calendarActivities)
                {
                    foreach (var adrCal in adrCalActivities)
                    {
                        if (cal.CalendarItemID == adrCal.CalendarItemID)
                        {
                            var adrCase = FileMaintenanceBusiness.Instance.GetADRMasterInfobyKeyword(adrCal.CaseNo, "CaseNo");
                            //LGF 08012011 ADR-59: add case coordinator - add CaseCoordinatorFilter
                            if (adrCase != null && CaseCoordinatorFilter(caseCoordinatorID, adrCase.CaseNo))
                            {
                                adrCase.ProcCode = _selectedProcCode;
                                adrCase.ProcDateString = cal.ProcDate.ToShortDateString();
                                _adrMasterList.Add(adrCase);
                            }
                        }
                    }
                }
            }
        }
        else
        {
            if (otherActivities != null && adrOtherActivities != null)
            {

                foreach (var otherActivity in otherActivities)
                {
                    foreach (var adrotherActivity in adrOtherActivities)
                    {
                        if (otherActivity.ActivityID == adrotherActivity.ActivityID)
                        {
                            var adrCase = FileMaintenanceBusiness.Instance.GetADRMasterInfobyKeyword(adrotherActivity.CaseNo, "CaseNo");
                            //LGF 08012011 ADR-59: add case coordinator - add CaseCoordinatorFilter
                            if (adrCase != null  && CaseCoordinatorFilter(caseCoordinatorID, adrCase.CaseNo))
                            {
                                adrCase.ProcCode = _selectedProcCode;
                                adrCase.ProcDateString = otherActivity.ProcDate.ToShortDateString();
                                _adrMasterList.Add(adrCase);
                            }
                        }
                    }
                }
            }
        }

        GeneratePrintReport();
    }
4

1 回答 1

0

这是由于内部身份映射模式实现而发生的。您永远不能将具有相同实体键的两个实体实例附加到同一上下文。Detach加载实体后,您必须简单地调用。

context.Detach(entity);

或者您可以尝试将实体加载为非跟踪(我不确定它是否解决了这个问题):

context.YourEntitySet.MergeOption = MergeOption.NoTracking;
// Now run the query from YourEntitySet

无论如何,您想要具有不同值的同一实体的两个实例是很奇怪的。您应该为您的“报告”使用单独的非实体对象并对该对象进行预测。您根本不必处理这个问题。

于 2011-08-31T12:10:34.287 回答