Свойство элемента в списке изменяет значение из источника EF - есть ли способ его «отсоединить»? - PullRequest
0 голосов
/ 31 августа 2011

У меня есть список, и этот список заполняется через цикл.Каждый цикл получает коллекцию прямо из БД.Проблема заключается в том, что когда он получает CaseNo (PK) с таким же CaseNo, существующим в списке, и я изменил значение одного из свойств, элемент с таким же CaseNo, который уже находится в списке, также изменяется.

ех.caseNo 1234, код процедуры = OTH

, затем я добавляю еще один элемент, который я снова получаю из БД.но на этот раз я программно изменяю код процедуры, элемент в списке выше также изменяется на это значение.Я не хочу, чтобы это произошло, потому что это не тот же самый Случай в записи, потому что Случай может иметь другой тип про-кода в качестве своей категории.

Я понял, что он меняется, потому что обнаруживает, что это тот же элемент, что и в списке, но мне нужно добавить тот же номер дела в список в качестве отдельного элемента, потому что код процедуры отличается,Есть ли способ, которым я могу относиться к нему как к другому объекту, как тот, что в списке?

Пример.данных 1.) CaseNO 123 Proc код OTH 2.) CaseNO 123 Proc код OTH

но мне нужно, чтобы это было: 1.) CaseNO 123 Proc код DSP 1.) CaseNO 123 Proc код OTH

происходит сбой при выполнении этой строки.

adrCase.ProcCode = "DSP";

тогда элемент в списке (_adrMasterList), если есть какой-либо с таким же регистром no, тоже изменяет свой код процедуры на "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();
    }

1 Ответ

0 голосов
/ 31 августа 2011

Это происходит из-за внутренней структуры карты идентификации реализации. Вы никогда не можете прикрепить два экземпляра объекта с одним и тем же ключом объекта к одному и тому же контексту. Вы должны просто позвонить Detach после загрузки объекта.

context.Detach(entity);

Или вы можете попытаться загрузить сущности как неотслеживаемые (я не уверен, что это решит эту проблему):

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

В любом случае странно, что вам нужны два экземпляра одного и того же объекта с разными значениями. Вы должны использовать отдельный объект не для вашего «отчета» и делать прогнозы на этот объект. Вам вообще не придется иметь дело с этой проблемой.

...