实体框架4导航属性null值会引发异常

时间:2011-07-15 13:31:03

标签: asp.net-mvc-3 entity-framework-4 repository

我正在尝试使用MVC3和实体框架4设置编辑功能。我有一个导航属性添加到我的客户实体,以允许我访问一对多的相关实体。我将相关实体定义为虚拟 - 它是以下CustomerSite实体中的Customer属性

namespace CustomerOrders.Domain.Entities
{
public class CustomerSite
{
    [HiddenInput(DisplayValue = false)]
    [Key]
    public int CustomerSiteId { get; set; }
    [HiddenInput(DisplayValue = false)]
    [DisplayName("Customer Id")]
    public int CustomerId { get; set; }
    [Required(ErrorMessage = "Please enter a unit no/street name")]
    [DisplayName("Address Line 1")]
    public string AddressLine1 { get; set; }
    public virtual Customer Customer { get; set; }

}
}

当我尝试将编辑保存到CustomerSite实体时,我得到以下异常

对象引用未设置为对象的实例。

现在,当我检查模型值时,唯一的空值是Customer导航属性,所以我假设那是什么抛出错误?当我检查模型时,EF必须自动填充外键属性,因为客户ID字段已正确填充。多数民众赞成在我认为是空的领域,因为我没有做任何额外的插入客户ID,我没有在视图中渲染编辑器。

这是我的保存方法

  public void SaveCustomerSite(CustomerSite customerSite)
    {
        if (customerSite.CustomerSiteId == 0)
        {
            context.CustomerSites.Add(customerSite);
        }
        context.SaveChanges();

        }

这就是我如何在EF数据上下文中定义的关系

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<CustomerSite>()
            .HasRequired(x => x.Customer);
    }

有人知道导航属性在保存编辑时是否为空将导致激活,如果是,我该如何解决?

感谢所有建议。

编辑================

这是异常的堆栈跟踪

at CustomerOrders.WebUI.Controllers.SiteAdminController.Edit(CustomerSite  customerSite) in C:\Users\administrator\documents\visual studio 2010\Projects \CustomerOrders\CustomerOrders.WebUI\Controllers\SiteAdminController.cs:line 43
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__DisplayClass15. <InvokeActionMethodWithFilters>b__12()
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)

2 个答案:

答案 0 :(得分:2)

 if (customerSite.CustomerSiteId == 0)

如果customerSite在传入时为null,则无法引用任何属性。

在此行之前测试null。

答案 1 :(得分:0)

另外注意。

在主 - 详细设置(一对多)中,我遇到了一个问题,即当仅填充主数据时,细节部分抛出异常。在我的控制器中,我添加了对master-detail的检查,如果它为null。

if(salesMain.SalesSub != null)
{
   //do something with SalesSub
}