我正在使用ASP.NET MVC 4(aspx),使用MSLinqToSQL作为到MYSQL数据库的连接器。我正在尝试基于某些条件更新对象的StatusID
。
条件很简单,当前状态不应该等于下面的特定状态-〉代码,所有这些都在一个try-catch中。
int ApplicationID = 20;
pleDBDataContext dp = new pleDBDataContext();
Recruit_Applicant_Application app = dp.Recruit_Applicant_Applications.FirstOrDefault(a => a.ApplicationID == ApplicationID);
var statuses = new List<string> { "New", "Rejected", "Archived", "Declined" };
if (statuses.Contains(app.Recruit_ApplicationStatuse.Status, StringComparer.OrdinalIgnoreCase))
{
app.ApplicationStatusID = dp.Recruit_ApplicationStatuses.FirstOrDefault(s => s.Status == "Evaluating").ApplicationStatusID;
}
dp.SubmitChanges(); //throws error here
但是,我不断得到这个错误:
由于对象的当前状态,操作无效
堆栈跟踪指向designer.cs中的this.SendPropertyChanging();
事件。
奇怪的是,如果我删除上面的[if ..语句],它就能正常工作...
ApplicationStatusID
是一个外键,它们之间的关系很强,我甚至重新构建了它们。
我甚至尝试引用第二个Recruit_Applicant_Application
对象并更新该对象,因为我认为我对当前对象的操作太多了--这不起作用。
我甚至尝试了以下没有成功...
int newstatusis = dp.Recruit_ApplicationStatuses.FirstOrDefault(s => s.Status == "Evaluating").ApplicationStatusID;
int currentstatusid= dp.Recruit_Applicant_Applications.FirstOrDefault(a => a.ApplicationID == ApplicationID).ApplicationStatusID;
string currentstatus =app.Recruit_ApplicationStatuse.Status;
var statuses = new List<string> { "New", "Rejected", "Archived", "Declined" };
if (statuses.Contains(currentstatus , StringComparer.OrdinalIgnoreCase)) //theres no reference to the 'app' object at all
{
currentstatusid = newstatusid;
}
app.ApplicationStatusID = currentstatusid;
dp.SubmitChanges(); //throws error here
我希望if语句验证当前状态,并且只有当它满足条件时才更新当前对象的状态......这并不复杂。
1条答案
按热度按时间f0brbegy1#
我不是Maven。如果Application对象有未保存的挂起更改,则表示对象关系的属性可能不可靠-特别是在外键ID已更新而EF尚未执行关联对象查找的情况下。这只是猜测。更有知识的人可能会提供更好的解释。
作为一种解决方法,也许可以检查ID而不是对象引用。
比如:
根据代码的结构,您甚至可以将状态ID值缓存到内存字典中,这将导致数据库命中。