【问题标题】:Save changes function not properly updating the database保存更改功能未正确更新数据库
【发布时间】:2019-01-23 21:14:22
【问题描述】:

所以,我有一个按钮可以触发一个 javascript 函数,它调用一个 AJAX 请求,调用一个应该更新我的数据库的 actionresult。

Javascript 调用

function changeDepartment() {

    // Initiate and value variables,
    var id = $('#requestId').val();
    var user = $('#contactUser').val();
    // Bind variables to data object
    var data = { id: id }
    // Ajax call with data.
    $.ajax({
        url: '@Url.Action("changeDepartmentActionResult", "ManageRequestResearch")',
        type: "POST",
        dataType: 'json',
        data: data,
        success: function (data, textStatus, XmlHttpRequest) {

            var name = data.name;

            window.location.href = '@Url.Action("Index", "ManageRequestResearch")';
            $('#btn-input').val('');
        },
        error: function (jqXHR, textStatus, errorThrown) {
            alert("responseText: " + jqXHR.responseText);
        }
    });
alert(data);

然后,我得到了动作结果:

[HttpPost]
public ActionResult changeDepartmentActionResult(string id)
{
    var moadEntities = new MOADEntities();
    moadEntities.Configuration.AutoDetectChangesEnabled = false;
    var researchBusiness = new ResearchRequestBusiness(moadEntities);
    var request = researchBusiness.FetchRequestById(Convert.ToInt32(id));

    var directoryObject = GetActiveDirectoryObject(request.Requestor);
    var requstorDisplayName = directoryObject != null ? directoryObject.DisplayName : request.RequestorFullName;
    var researchRequestFileBusiness = new ResearchRequestFilesBusiness(moadEntities);
    var requestFiles = researchRequestFileBusiness.FetchFilesByRequestId(Convert.ToInt32(id));

    var viewModel = new ManageSelectedRequestResearchViewModel()
    {
        RequestDetails = request,
        RequestActivity = request.tbl_ResearchRequestActivity.Select(d => d).ToList(),
        Files = requestFiles
    };

    moadEntities.Configuration.AutoDetectChangesEnabled = false;


    if (request.GovernmentEnrollment == true)
    {
        request.GovernmentEnrollment = false;
        request.ManagedCare = true;
        moadEntities.SaveChanges();
    }
    else
    {
        request.ManagedCare = false;
        request.GovernmentEnrollment = true;
        moadEntities.SaveChanges();
    }

    return Json("Status changed successfully", JsonRequestBehavior.AllowGet);
}

据我观察,它返回了正确的记录,正确地进行了更改,并点击了 Context.SaveChanges(); 调试时——我可以在保存更改之前看到值确实发生了变化,但是——在数据库内部,没有保存任何更改。

另外,我检查了连接字符串是否有效。

知道是什么原因造成的吗? 提前谢谢!

【问题讨论】:

  • 1. “我可以在保存更改之前看到值确实发生了变化”你在哪里看到这个? 2. 在您的 changeDepartmentActionResult(string id) 方法中,您似乎没有应用任何要保存的新值?
  • 为什么你禁用 AutoDetectChanges 两次,然后再也不启用它?在异常情况下会发生什么?另外,上下文实例会发生什么?

标签: javascript c# asp.net ajax entity-framework


【解决方案1】:

您似乎正在修改实体,而自动检测更改被禁用。

如果是故意的,那么您应该通知上下文实体已更改。

我假设MOADEntities 派生自DbContext。所以不要这样:

if (request.GovernmentEnrollment == true)
{
    request.GovernmentEnrollment = false;
    request.ManagedCare = true;
    moadEntities.SaveChanges();
}
else
{
    request.ManagedCare = false;
    request.GovernmentEnrollment = true;
    moadEntities.SaveChanges();
}

我会试试这个:

// Simplify the if..else block
request.ManagedCare = request.GovernmentEnrollment;
request.GovernmentEnrollment = !request.GovernmentEnrollment;

// Notifying the context that the 'request' entity has been modified.
// EntityState enum is under System.Data.Entity namespace
moadEntities.Entry(request).State = EntityState.Modified;

// Now we can save the changes.
moadEntities.SaveChanges();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 2014-01-09
    • 2019-01-31
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多