列表中项目的属性更改了 EF 源中的值 - 有没有办法“分离”列表中的值?它?

发布于 2024-12-02 01:14:22 字数 9480 浏览 2 评论 0原文

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

前任。 caseNo 1234,proc code = OTH

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

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

前任。数据的 1.)案例编号123 过程代码 OTH 2.) 案例编号 123 过程代码OTH,

但我需要它是: 1.)案例编号123 DSP处理代码 1.)案例编号123 Proc 代码

执行此行时,

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

I have a list and this list is being populated thru loop. Each loop gets a collection directly from DB. The problem is that when it gets CaseNo(PK) that has the same CaseNo existing in the list and I changed the value of one of the property, the item that has the same CaseNo which is already in the list also changes.

ex. caseNo 1234, proc code = OTH

then I add another item which I get from DB again. but this time I programatically change the proc code, the item in the list above also changes to that value also.
I do not want that to happen because it is not the same Case in the record because a Case can have different type of pro code as its category.

I get that it is changing because it is detecting that it is the same item as the one in the list but I need to add the same case number in the list as a separate item because the proc code is different. Is there a way I can treat it as different entity as the one in the list?

Ex. of data
1.)CaseNO 123
Proc code OTH
2.) CaseNO 123
Proc code OTH

but I need it to be:
1.)CaseNO 123
Proc code DSP
1.)CaseNO 123
Proc code OTH

it goes wrong when this line is executed.

adrCase.ProcCode = "DSP";

then the item in the list (_adrMasterList) if there is any with the same case no, changes its proc code too to "DSP".

here is my code:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

擦肩而过的背影 2024-12-09 01:14:22

发生这种情况是由于内部身份映射模式实现。您永远不能将具有相同实体键的两个实体实例附加到同一上下文。加载实体后,您只需调用 Detach 即可。

context.Detach(entity);

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

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

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

That is happening because of internal identity map pattern implementation. You can never have attached two entity instances with the same entity key to the same context. You must simply call Detach once you load the entity.

context.Detach(entity);

Or you can try to load entities as non tracked (I'm not sure if it solves this problem):

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

Anyway it is odd that you want two instances of the same entity with different values. You should use separate non entity object for your "report" and make projections to that object. You would not have to deal with this problem at all.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文