mysql 尝试更新linq-to-sql对象时引发错误

kse8i1jr  于 2023-01-29  发布在  Mysql
关注(0)|答案(1)|浏览(134)

我正在使用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语句验证当前状态,并且只有当它满足条件时才更新当前对象的状态......这并不复杂。

f0brbegy

f0brbegy1#

我不是Maven。如果Application对象有未保存的挂起更改,则表示对象关系的属性可能不可靠-特别是在外键ID已更新而EF尚未执行关联对象查找的情况下。这只是猜测。更有知识的人可能会提供更好的解释。
作为一种解决方法,也许可以检查ID而不是对象引用。
比如:

var statuses = new List<string> { "New", "Rejected", "Archived", "Declined" };
var statusIds = dp.Recruit_ApplicationStatuses
    .Where(s => statuses.Contains(s.Status))
    .Select(s => s.StatusId)
    .ToList();

if (statusIds.Contains(app.ApplicationStatusID))
{
   app.ApplicationStatusID = dp.Recruit_ApplicationStatuses.FirstOrDefault(s => s.Status == "Evaluating").ApplicationStatusID;
}

根据代码的结构,您甚至可以将状态ID值缓存到内存字典中,这将导致数据库命中。

相关问题