列表中的项目属性从 EF 源更改值 - 有没有办法“分离”它?
Posted
技术标签:
【中文标题】列表中的项目属性从 EF 源更改值 - 有没有办法“分离”它?【英文标题】:Item's property inside a list changes value from EF source - is there a way to 'detach' it? 【发布时间】:2011-08-31 10:40:32 【问题描述】:我有一个列表,这个列表正在通过循环填充。每个循环都直接从 DB 获取一个集合。问题是,当它获得具有相同 CaseNo 在列表中存在的 CaseNo(PK) 并且我更改了其中一个属性的值时,列表中已经存在的具有相同 CaseNo 的项目也会更改。
例如。案例编号 1234,过程代码 = OTH
然后我再次添加从 DB 获得的另一个项目。但这次我以编程方式更改 proc 代码,上面列表中的项目也更改为该值。 我不希望这种情况发生,因为它在记录中不是同一个案例,因为案例可以有不同类型的专业代码作为其类别。
我知道它正在发生变化,因为它检测到它与列表中的项目相同,但我需要在列表中添加相同的案例编号作为单独的项目,因为 proc 代码不同。有没有办法可以将它视为与列表中的不同的实体?
例如。数据的 1.)案例NO 123 过程代码 OTH 2.) 案例编号 123 过程代码 OTH
但我需要它是: 1.)案例NO 123 过程代码 DSP 1.)案例NO 123 过程代码 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();
【问题讨论】:
【参考方案1】:这是由于内部 identity map pattern 实现而发生的。您永远不能将具有相同实体键的两个实体实例附加到同一上下文。加载实体后,您必须简单地调用 Detach
。
context.Detach(entity);
或者您可以尝试将实体加载为非跟踪(我不确定它是否解决了这个问题):
context.YourEntitySet.MergeOption = MergeOption.NoTracking;
// Now run the query from YourEntitySet
无论如何,您想要 same 实体的两个实例具有不同的值是很奇怪的。您应该为您的“报告”使用单独的非实体对象并对该对象进行预测。您根本不必处理这个问题。
【讨论】:
以上是关于列表中的项目属性从 EF 源更改值 - 有没有办法“分离”它?的主要内容,如果未能解决你的问题,请参考以下文章