我试图从一些问卷调查中获取结果,然后将结果发送到某个API进行评分,并将结果返回,在成功返回结果后,将其作为对象保存到实体。
这是我的代码:(不重要的数据被星星替换)
internal static List<ScreeningTool> GetSurveyResults(OpenCase openCase, int screeningToolId, short screeningId)
{
using (var cmDb = new DBEntities())
{
var currentScreeningTool = cmDb.ScreeningTools.Find(openCase.CaseId, screeningToolId, screeningId);
var SFClient = new Core.OptumSurveySF10.amIhealthySoapClient();
var Key = "*******************************";
var GroupId = *****;
var GroupLogin = "*******";
var SurveyId = *****;
var SiteLogin = "*************";
short AdministrationType = 5;
var AdministrationDate = DateTime.Now.ToShortDateString();
short SessionType = 3;
var Age = (DateTime.Today.Year - openCase.BirthDate.Value.Year - (openCase.BirthDate.Value.DayOfYear > DateTime.Today.DayOfYear ? 1 : 0));
var DOB = openCase.BirthDate.Value.ToShortDateString();
var Gender = "";
if(screeningToolId == 15)
{
SurveyId = 52304;
var GH01_Response = currentScreeningTool.ScreeningToolAnswers.Where(x => x.QuestionId == 1).Select(a => a.AnswerId).First();
var PF02_Response = currentScreeningTool.ScreeningToolAnswers.Where(x => x.QuestionId == 3).Select(a => a.AnswerId).First();
var PF04_Response = currentScreeningTool.ScreeningToolAnswers.Where(x => x.QuestionId == 4).Select(a => a.AnswerId).First();
var RP02_Response = currentScreeningTool.ScreeningToolAnswers.Where(x => x.QuestionId == 6).Select(a => a.AnswerId).First();
var RP03_Response = currentScreeningTool.ScreeningToolAnswers.Where(x => x.QuestionId == 7).Select(a => a.AnswerId).First();
var RE02_Response = currentScreeningTool.ScreeningToolAnswers.Where(x => x.QuestionId == 9).Select(a => a.AnswerId).First();
var RE03_Response = currentScreeningTool.ScreeningToolAnswers.Where(x => x.QuestionId == 10).Select(a => a.AnswerId).First();
var BP02_Response = currentScreeningTool.ScreeningToolAnswers.Where(x => x.QuestionId == 11).Select(a => a.AnswerId).First();
var MH03_Response = currentScreeningTool.ScreeningToolAnswers.Where(x => x.QuestionId == 13).Select(a => a.AnswerId).First();
var VT02_Response = currentScreeningTool.ScreeningToolAnswers.Where(x => x.QuestionId == 14).Select(a => a.AnswerId).First();
var MH04_Response = currentScreeningTool.ScreeningToolAnswers.Where(x => x.QuestionId == 15).Select(a => a.AnswerId).First();
var SF02_Response = currentScreeningTool.ScreeningToolAnswers.Where(x => x.QuestionId == 16).Select(a => a.AnswerId).First();
var MH01_Response = -1;
var MH02_Response = -1;
var MH05_Response = -1;
var HT_Response = -1;
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
var results = SFClient.SF12v2Session(Key, GroupId, GroupLogin, SiteLogin, SurveyId, AdministrationType, AdministrationDate, SessionType, openCase.CaseId, "", "", "", Gender, GH01_Response, PF02_Response, PF04_Response, RP02_Response,
RP03_Response, RE02_Response, RE03_Response, BP02_Response, MH03_Response, VT02_Response, MH04_Response, SF02_Response, MH01_Response,
MH02_Response, MH05_Response, HT_Response, "", "");
if (results.Scored)
{
var pcsFormat = Math.Sqrt(Math.Pow(results.PCSScore, 2));
var mcsFormat = Math.Sqrt(Math.Pow(results.MCSScore, 2));
var pcs = String.Format("{0:0.00}", pcsFormat);
var mcs = String.Format("{0:0.00}", mcsFormat);
var screeningToolAnswer17 = new ScreeningToolAnswer();
screeningToolAnswer17.CaseId = openCase.CaseId;
screeningToolAnswer17.ScreeningToolId = screeningToolId;
screeningToolAnswer17.ScreeningId = screeningId;
screeningToolAnswer17.InfoInsertId = currentScreeningTool.InfoInsertId;
screeningToolAnswer17.InfoInsertTime = DateTime.Now;
screeningToolAnswer17.InfoChangeId = currentScreeningTool.InfoInsertId;
screeningToolAnswer17.InfoChangeTime = DateTime.Now;
screeningToolAnswer17.QuestionId = 17;
screeningToolAnswer17.AnswerId = 1;
screeningToolAnswer17.AnswerText = pcs;
var screeningToolAnswer18 = new ScreeningToolAnswer();
screeningToolAnswer18.CaseId = openCase.CaseId;
screeningToolAnswer18.ScreeningToolId = screeningToolId;
screeningToolAnswer18.ScreeningId = screeningId;
screeningToolAnswer18.InfoInsertId = currentScreeningTool.InfoInsertId;
screeningToolAnswer18.InfoInsertTime = screeningToolAnswer17.InfoInsertTime;
screeningToolAnswer18.InfoChangeId = currentScreeningTool.InfoChangeId;
screeningToolAnswer18.InfoChangeTime = screeningToolAnswer17.InfoInsertTime;
screeningToolAnswer18.QuestionId = 18;
screeningToolAnswer18.AnswerId = 1;
screeningToolAnswer18.AnswerText = mcs;
cmDb.ScreeningToolAnswers.Add(screeningToolAnswer17);
cmDb.ScreeningToolAnswers.Add(screeningToolAnswer18);
cmDb.SaveChanges();
}
else
{
return null;
}
}
else if(screeningToolId == 14)
{
var FirstName = "";
var LastName = "";
var MemberLogin = openCase.CaseId;
var GHGLOBALResponse = currentScreeningTool.ScreeningToolAnswers.Where(x => x.QuestionId == 1).Select(a => a.AnswerId).First();
var PFSOMEResponse = currentScreeningTool.ScreeningToolAnswers.Where(x => x.QuestionId == 3).Select(a => a.AnswerId).First(); ;
var PFBENDResponse = currentScreeningTool.ScreeningToolAnswers.Where(x => x.QuestionId == 4).Select(a => a.AnswerId).First(); ;
var RPKINDResponse = currentScreeningTool.ScreeningToolAnswers.Where(x => x.QuestionId == 5).Select(a => a.AnswerId).First(); ;
var REBKINDResponse = currentScreeningTool.ScreeningToolAnswers.Where(x => x.QuestionId == 6).Select(a => a.AnswerId).First(); ;
var BPGLOBALResponse = currentScreeningTool.ScreeningToolAnswers.Where(x => x.QuestionId == 7).Select(a => a.AnswerId).First(); ;
var SEFRIENDResponse = currentScreeningTool.ScreeningToolAnswers.Where(x => x.QuestionId == 8).Select(a => a.AnswerId).First(); ;
var SEOVERALLResponse = currentScreeningTool.ScreeningToolAnswers.Where(x => x.QuestionId == 9).Select(a => a.AnswerId).First(); ;
var MHUPSETResponse = currentScreeningTool.ScreeningToolAnswers.Where(x => x.QuestionId == 10).Select(a => a.AnswerId).First(); ;
var BEGLOBALResponse = currentScreeningTool.ScreeningToolAnswers.Where(x => x.QuestionId == 11).Select(a => a.AnswerId).First(); ;
var result = SFClient.SF10R1Session(Key, GroupId, GroupLogin, SiteLogin, SurveyId, AdministrationType, AdministrationDate, SessionType,
MemberLogin, FirstName, LastName, DOB, Age, Gender, GHGLOBALResponse, PFSOMEResponse, PFBENDResponse,
RPKINDResponse, REBKINDResponse, BPGLOBALResponse, SEFRIENDResponse, SEOVERALLResponse,
MHUPSETResponse, BEGLOBALResponse);
if (result.Scored)
{
var phs = String.Format("{0:0.00}", result.PHS10Score);
var pss = String.Format("{0:0.00}", result.PSS10Score);
var screeningToolAnswer12 = new ScreeningToolAnswer();
screeningToolAnswer12.CaseId = openCase.CaseId;
screeningToolAnswer12.ScreeningToolId = screeningToolId;
screeningToolAnswer12.ScreeningId = screeningId;
screeningToolAnswer12.InfoInsertId = currentScreeningTool.InfoInsertId;
screeningToolAnswer12.InfoInsertTime = DateTime.Now;
screeningToolAnswer12.InfoChangeId = currentScreeningTool.InfoChangeId;
screeningToolAnswer12.InfoChangeTime = screeningToolAnswer12.InfoInsertTime;
screeningToolAnswer12.QuestionId = 12;
screeningToolAnswer12.AnswerId = 1;
screeningToolAnswer12.AnswerText = phs;
var screeningToolAnswer13 = new ScreeningToolAnswer();
screeningToolAnswer13.CaseId = openCase.CaseId;
screeningToolAnswer13.ScreeningToolId = screeningToolId;
screeningToolAnswer13.ScreeningId = screeningId;
screeningToolAnswer13.InfoInsertId = currentScreeningTool.InfoInsertId;
screeningToolAnswer13.InfoInsertTime = screeningToolAnswer12.InfoInsertTime;
screeningToolAnswer12.InfoChangeId = currentScreeningTool.InfoChangeId;
screeningToolAnswer12.InfoChangeTime = screeningToolAnswer12.InfoInsertTime;
screeningToolAnswer13.QuestionId = 13;
screeningToolAnswer13.AnswerId = 1;
screeningToolAnswer13.AnswerText = pss;
cmDb.ScreeningToolAnswers.Add(screeningToolAnswer12);
cmDb.ScreeningToolAnswers.Add(screeningToolAnswer13);
cmDb.SaveChanges();
}
return cmDb.ScreeningTools.Where(x => x.ScreeningToolId == screeningToolId && x.CaseId == openCase.CaseId && x.ScreeningId == screeningId).ToList();
}
}由于某些原因,ScreeningToolId == 15的条件很好,我能够提交多份问卷没什么问题,但是当ScreeningToolId == 14让{"Validation failed for one or more entities. See 'EntityValidationErrors' property for more details."}看ValidationErrors时没有多大帮助。
当我查找它时,到处都提到要将cmDb.SaveChanges();封装在一个try块中,所以我将它包装为:
try
{
cmDb.SaveChanges();
}
catch (System.Data.Entity.Validation.DbEntityValidationException e)
{
foreach(var eve in e.EntityValidationErrors)
{
Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
eve.Entry.Entity.GetType().Name, eve.Entry.State);
foreach( var ve in eve.ValidationErrors)
{
Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
ve.PropertyName, ve.ErrorMessage);
}
}
throw;
}它返回"OriginalValues不能用于添加状态的实体“的消息。和'(new System.Collections.Generic.Mscorlib_CollectionDebugView<System.Data.Entity.Validation.DbEntityValidationResult>(($exception).EntityValidationErrors).Items[0]).Entry.OriginalValues' threw an exception of type 'System.InvalidOperationException'
这应该是try/catch块的两个输出之一。但我没看到另一个。它显示的例外对我来说毫无意义。DBContext.SaveChanges()怎么可能不是有效的操作?
对不起,如果我错过了重要的信息,如果你需要什么,让我知道,我会添加它。
发布于 2020-07-27 14:40:28
在定义screeningtoolanswer13的地方,有两行带有错误的行,而不是screeningtoolanswer12。这就是导致这个问题的原因。修正了错误,现在它运行得完美无缺。
https://stackoverflow.com/questions/63064910
复制相似问题