use*_*794 222 c# asp.net-mvc entity-framework asp.net-mvc-3 entity-framework-5
我有一个控制器动作,可以在本地和生产中使用Firefox,在本地使用IE,但在生产中不是IE.这是我的控制器动作:
public ActionResult MNPurchase()
{
CalculationViewModel calculationViewModel = (CalculationViewModel)TempData["calculationViewModel"];
decimal OP = landTitleUnitOfWork.Sales.Find()
.Where(x => x.Min >= calculationViewModel.SalesPrice)
.FirstOrDefault()
.OP;
decimal MP = landTitleUnitOfWork.Sales.Find()
.Where(x => x.Min >= calculationViewModel.MortgageAmount)
.FirstOrDefault()
.MP;
calculationViewModel.LoanAmount = (OP + 100) - MP;
calculationViewModel.LendersTitleInsurance = (calculationViewModel.LoanAmount + 850);
return View(calculationViewModel);
}
Run Code Online (Sandbox Code Playgroud)
这是我在IE中获得的堆栈跟踪:
错误.处理您的请求时发生错误.System.Reflection.TargetException:非静态方法需要一个目标.System.Reflection.RuntimeMethodInfo.Invoke的System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj,BindingFlags invokeAttr,Binder binder,Object []参数,CultureInfo文化)中的System.Reflection.RuntimeMethodInfo.CheckConsistency(Object target)处于System.Reflection.RuntimeMethodInfo.Invoke(Object obj, System.Data.Objects.ELinq.QueryParameterExpression.TryGetFieldOrPropertyValue(MemberExpression me,Object instance,System.Reflection.RuntimePropertyInfo.GetValue(Object obj,Object [] index)中的BindingFlags invokeAttr,Binder binder,Object []参数,CultureInfo文化) System.Data.Objects.ELinq.ELinqQueryState上的System.Data.Objects.ELinq.QueryParameterExpression.EvaluateParameter(Object [] arguments)中的System.Data.Objects.ELinq.QueryParameterExpression.TryEvaluatePath(Expression expression,ConstantExpression&constantExpression)中的Object&memberValue) .GetExecutionPlan(Nullable
1 forMergeOption) at System.Data.Objects.ObjectQuery1.GetResults(Nullable1 forMergeOption) at System.Data.Objects.ObjectQuery1.System.Collections.Generic.IEnumerable.GetEnumerator()在System.Linq.Enumerable.FirstOrDefault [T 来自1 source) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryableCastle.Proxies的System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext,IDictionary2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2参数)的lambda_method(Closure,ControllerBase,Object [])中的LandTitle.Controllers.HomeController.MNRefi()的源代码(IEnumerable 1 source)在Castle.Proxies.Asvideo.TrocodAnTergetMotod.InvokeMethodOnTarget()中的Castle.DynamicProxy.AbstractInvocation.Proceed()在Castle.Proxies.AsyncControllerActionInvokerProxy.InvokeActionMethod的Castle.DynamicProxy.AbstractInvocation.Proceed()中的Glimpse.Mvc3.Interceptor.InvokeActionMethodInterceptor.Intercept(IInvocation调用) (ControllerContext controllerContext,ActionDescriptor actionDescriptor,IDictionary`2参数)在System.Web.Mvc.Async.AsyncControllerActionInvoker.<> c__DisplayClass37.<> c__DisplayClass39.b__33()at System.Web.Mvc.Async.AsyncControllerActionInvoker.<> c__DisplayClass4f.b__49 ()at System.Web.Mvc.Async.AsyncControllerActionInvoker.<> c__DisplayClass37.b__36(IAsyncResult asyncResult)at at System.Web.Mvc.Async.AsyncControllerActionInvoker.<> c__DisplayClass25.<> c__DisplayClass2a.b__20()在System.Web.Mvc.Async.AsyncControllerActionInvoker.<> c__DisplayClass25.b__22(IAsyncResult asyncResult)
Maa*_*ten 471
我认为当你在lambda中使用变量时会发生这种令人困惑的异常,这在运行时是一个空引用.在您的情况下,我会检查您的变量calculationViewModel是否为空引用.
就像是:
public ActionResult MNPurchase()
{
CalculationViewModel calculationViewModel = (CalculationViewModel)TempData["calculationViewModel"];
if (calculationViewModel != null)
{
decimal OP = landTitleUnitOfWork.Sales.Find()
.Where(x => x.Min >= calculationViewModel.SalesPrice)
.FirstOrDefault()
.OP;
decimal MP = landTitleUnitOfWork.Sales.Find()
.Where(x => x.Min >= calculationViewModel.MortgageAmount)
.FirstOrDefault()
.MP;
calculationViewModel.LoanAmount = (OP + 100) - MP;
calculationViewModel.LendersTitleInsurance = (calculationViewModel.LoanAmount + 850);
return View(calculationViewModel);
}
else
{
// Do something else...
}
}
Run Code Online (Sandbox Code Playgroud)
小智 12
我发现当我们手动实例化实体而不是通过将解析所有导航属性的DBContext时,这个问题在实体框架中很普遍.如果表之间存在外键引用(导航属性)并且您在lambda中使用这些引用(例如ProductDetail.Products.ID),那么如果您手动创建实体,那么"Products"上下文将保持为null.
Non-static method requires a target 对于在运行 MS Test 单元测试时遇到错误的任何人[DynamicData] [DataTestMethod],该错误可能是由于未进行静态数据测试场景收集而引起的static,即确保您具有:
public **static** IEnumerable<object[]> MyFakeData =>
new[]
{
new object[] { "Foo" },
new object[] { "Bar" }
};
[DynamicData(nameof(MyFakeData))]
[DataTestMethod]
public void DoMyTests(string someData) {...}
Run Code Online (Sandbox Code Playgroud)
调试起来非常烦人,因为没有有用的堆栈跟踪
所有答案都指向带有 NRE(空引用异常)的 Lambda 表达式。我发现使用 Linq to Entities 时也会出现这种情况。我认为指出此异常不仅限于 Lambda 表达式内的 NRE 会很有帮助。
| 归档时间: |
|
| 查看次数: |
203150 次 |
| 最近记录: |