Gal*_*len 7 c# asp.net asp.net-mvc
我现在有一个删除对象的问题,本周早些时候这段代码工作正常,但现在我得到一个空引用异常,即使我试图删除的对象,以及实体框架的实例不是空的.
MHNHubEntities _entities = new MHNHubEntities();
// Get, GetList, Add, Save etc.
public void Delete(PackageProduct packageProduct)
{
_entities.PackageProducts.DeleteObject(packageProduct);
}
Run Code Online (Sandbox Code Playgroud)
packageProduct是一个有效的packageProduct,除此删除之外的所有其他内容都有效.通常我不会问如何解决空引用异常 - 因为它相当明显,检查空值.然而 - 在这种情况下,我很难过,昨天突然发生的事情不是,这就是抛出异常的原因.任何帮助将不胜感激,我已经确认抛出此异常时不涉及空对象.
编辑
我不想排除某些东西是空的并导致这种情况 - 因为抛出异常的本质.根据请求,这里是堆栈跟踪:
at MHNHub.Areas.Store.Controllers.SettingsController.DeletePackage(Int32 id, FormCollection collection) in C:\Users\Grahame\Desktop\Projects\MHN Hub\Visual Studio Project\MHNHub\MHNHub\Areas\Store\Controllers\SettingsController.cs:line 618
at lambda_method(Closure , ControllerBase , Object[] )
at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.<InvokeActionMethodWithFilters>b__a()
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
Run Code Online (Sandbox Code Playgroud)
继承我的控制器动作:
[HttpGet]
public ActionResult DeletePackage(int id, FormCollection collection)
{
try
{
IPackageRepository packageRepository = new PackageRepository();
var package = packageRepository.GetPackage(id);
IPackageProductRepository packageProductRepository = new PackageProductRepository();
var packageProducts = package.PackageProducts.ToList();
foreach (var packageProduct in packageProducts)
{
packageProductRepository.Delete(packageProduct);
}
packageRepository.Delete(package);
packageRepository.Save();
return Json(new { Success = "true" }, JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
//return JSON with exception
var result = new { Message = ex.Message, InnerException = ex.InnerException.ToString() };
return Json(result, JsonRequestBehavior.AllowGet);
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,如果它正在这条线上:
_entities.PackageProducts.DeleteObject(packageProduct);
Run Code Online (Sandbox Code Playgroud)
并假设这不是由于内联DeleteObject(即错误实际存在于那里),那么只有两个可能的原因NullReferenceException:
_entities 为空_entities.PackageProducts 为空如果这种情况可重复发生,应该很容易找出它是什么:
public void Delete(PackageProduct packageProduct)
{
var x = _entities;
if (x == null)
{
throw new Exception("_entities was null");
}
var y = x.PackageProducts;
if (y == null)
{
throw new Exception("_entities.PackageProducts was null");
}
y.DeleteObject(packageProduct);
}
Run Code Online (Sandbox Code Playgroud)
(当然,仅用于诊断目的.)
我已经弄清楚了 - 感谢大家的时间。堆栈跟踪显示我正在查看错误的异常:
第 618 行:var result = new { Message = ex.Message, InnerException = ex.InnerException.ToString() };
null 引用来自 InnerException 为 null。真正的例外是:
base {System.SystemException} = {"The object cannot be deleted because it was not found in the ObjectStateManager."}
Run Code Online (Sandbox Code Playgroud)
通过更改我获取 packageProducts 列表的方式解决了这个问题,最初是这样的:
IPackageRepository packageRepository = new PackageRepository();
var package = packageRepository.GetPackage(id);
IPackageProductRepository packageProductRepository = new PackageProductRepository();
var packageProducts = package.PackageProducts.ToList();
Run Code Online (Sandbox Code Playgroud)
现在就是这样:
IPackageProductRepository packageProductRepository = new PackageProductRepository();
var packageProducts = packageProductRepository.GetPackageProducts().Where(p=>p.PackageId == package.PackageId).ToList();
Run Code Online (Sandbox Code Playgroud)
它正在发挥作用!
但感谢一切 - 我学到了一些调试的新技巧:D!
| 归档时间: |
|
| 查看次数: |
27519 次 |
| 最近记录: |