我认为在理解跟踪实体框架中的属性值变化时,我遗漏了一些东西。
我有一个存储服务请求的应用程序。每当服务请求记录中的团队值发生变化时,我想在相关的团队历史实体中创建团队历史记录。
我使用控制器和视图的标准脚手架在MVC中创建了应用程序。 在控制器中的(post)编辑任务中,生成的标准逻辑具有以下代码
if (ModelState.IsValid)
{
db.Entry(serviceRequest).State = EntityState.Modified;
await db.SaveChangesAsync();
return RedirectToAction("Index");
}
return View(serviceRequest);
我已将其修改为包括创建团队历史记录和为团队内部分配的个人历史记录。创建这些相关记录的代码有效,但我希望这些记录仅在团队或成员(个人)上的值与之前的值相比时创建。
到目前为止,我指定的条件不能正确触发,因为我没有得到正确的条件。以下是当前代码:
// string teamorig = db.Entry(serviceRequest).Property(u => u.Team).OriginalValue.ToString(); // string teamcurr = db.Entry(serviceRequest).Property(u => u.Team)。CurrentValue.ToString(); // if(teamorig!= teamcurr)
var TeamIsModified = db.Entry(serviceRequest).Property(u => u.Team).IsModified;
if (TeamIsModified)
{
serviceRequest.TeamAssignmentHistories.Add(new TeamAssignmentHistory()
{
DateAssigned = DateTime.Now,
AssignedBy = User.Identity.Name,
ServiceRequest = serviceRequest.Id,
Team = serviceRequest.Team
});
}
//=========================================================================================
// if individual assigned has changed add individual history record========================
var IndividualIsModified = db.Entry(serviceRequest).Property(u => u.Member).IsModified;
if (IndividualIsModified)
{
serviceRequest.IndividualAssignmentHistories.Add(new IndividualAssignmentHistory()
{
DateAssigned = DateTime.Now,
AssignedBy = User.Identity.Name,
ServiceRequest = serviceRequest.Id,
AssignedTo = serviceRequest.Member.Value,
});
}
//===========================================================================================
var teamismodified逻辑不起作用。当我保存页面而不对其进行任何更改时 - 逻辑开始,因为在调试时它认为该字段已被修改。
当我注释掉该代码并将其上面的代码取消注释为原始值和当前值 - 即teamorig和teamcurr逻辑时,teamcurr和teamorig在调试中具有相同的值,即使它们已被强制更改为save MVC视图页面。因为它们具有相同的值,所以if条件为false,因此不会创建团队历史记录。
以上代码夹在中间
db.Entry(serviceRequest).State = EntityState.Modified;
和 等待db.SaveChangesAsync(); 语句。
我不了解mvc中实体框架跟踪变化的内容?为什么在我不对团队进行更改时认为它已被修改,为什么在我做出更改时teamorig和teamcurr是一样的?
欢迎任何建议。感谢