我正在尝试使用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)
答案 0 :(得分:2)
if (customerSite.CustomerSiteId == 0)
如果customerSite在传入时为null,则无法引用任何属性。
在此行之前测试null。
答案 1 :(得分:0)
另外注意。
在主 - 详细设置(一对多)中,我遇到了一个问题,即当仅填充主数据时,细节部分抛出异常。在我的控制器中,我添加了对master-detail的检查,如果它为null。
if(salesMain.SalesSub != null)
{
//do something with SalesSub
}