【问题标题】:SaveChanges only works in debugSaveChanges 仅适用于调试
【发布时间】:2018-04-20 06:47:21
【问题描述】:

我有一个看起来像这样的 MVC 控制器方法:

[HttpPost]
public async Task<JsonResult> Edit(Foo input)
{
    if (ModelState.IsValid)
    {
        Foo current = await db.foos.FindAsync(input.Id);
        current.SomeProp = input.SomeProp; // etc.
        db.Entry(current).State = EntityState.Modified;
        await db.SaveChangesAsync();
        return Json(true, JsonRequestBehavior.AllowGet);
    }
    return Json(false, JsonRequestBehavior.AllowGet);
}

这在我在 Visual Studio 中调试时有效。当我不调试时,我得到 500。调试在这里有什么不同?

注意:我没有使用db.Entry(current).CurrentValues.SetValues(input);,因为Foo 的某些属性我不想在这里更改。

编辑:我不知道在不处于调试模式时如何获取异常详细信息。我尝试将其写入文件。这在调试模式下有效(throw new Exception("test"); 代替了仅在调试模式下有效的语句),但在不调试时我得到 401。 IIS 用户确实对该目录具有写权限。

【问题讨论】:

  • 错误的详细信息是什么? 500 错误是一般调试的方法。
  • 响应 500 = 服务器错误 = 您的代码有未处理的异常。添加一些日志记录、使用 windebug 或执行其他操作来确定异常是什么。有很多方法可以获取异常及其详细信息(类型、堆栈跟踪、内部异常等)。
  • @Igor 相信我,我试过了。经过几个小时的搜索,我无法找到任何方法来获取非调试模式下的异常。
  • @ErikPhilips 查看我的编辑。
  • 使用ELMAH 记录异常。这是这类东西的事实上的标准。

标签: c# asp.net-mvc entity-framework


【解决方案1】:

异常是DbEntityValidationException,表示缺少必填字段。缺少的字段是Foo 的关系。

基于Entity Framework Loading Related Entities,我相信我的代码会延迟加载Foo 的关系。我什至没有考虑这种可能性,因为我误解了 "EF doesn't support asynchronous lazy loading." 这样的 cmets 在调试模式下检查对象似乎确认它的关系正在被急切地加载。但现在我意识到检查对象可能触发了延迟加载!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-07
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多