Entity Framework 4 Значение свойства NULL для навигации вызывает исключение - PullRequest
1 голос
/ 15 июля 2011

Я пытаюсь настроить функциональность редактирования, используя MVC3 и каркас сущностей 4. У меня есть свойство навигации, добавляемое к моей сущности клиента, чтобы позволить мне получить доступ к одной связанной сущности. У меня есть связанная сущность, определенная как виртуальная - это свойство Customer в сущности CustomerSite ниже

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 должен автоматически заполнить свойство внешнего ключа, так как поле идентификатора клиента заполнено правильно, когда я проверяю модель. Это поле, которое я ожидал, чтобы быть пустым, поскольку я ничего не сделал, чтобы вставить идентификатор клиента, для которого я не отображаю редактор в представлении.

Это мой метод сохранения

  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 ]

2 голосов
/ 15 июля 2011
 if (customerSite.CustomerSiteId == 0)

Если customerSite имеет значение null, когда оно передается, вы не можете ссылаться на какие-либо свойства.

Проверка на нулевое значение перед этой строкой.

0 голосов
/ 03 мая 2012

Дополнительное примечание.

В настройке детализации мастера (один ко многим) у меня возникла проблема, при которой часть детализации выдавала исключение при заполнении только мастера.В моем контроллере я добавил проверку на master-detail, если он был нулевым.

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