2014-08-20 2 views
3

Я видел несколько потоков, касающихся этого, но ни один из них, похоже, не помогает в моем случае. Я запрашиваю (с EF) в объекты POCO, а затем пытаюсь вернуть результаты через Json в проекте MVC.SqlNullValueException: данные являются нулевыми по вызову Json

Мой контроллер возвращает JsonResult и последние 2 строки моего контроллера выглядеть следующим образом:

var results = _context.Churches.Include(c => c.Address).Include(c => c.Address.Country).Where(predicate).ToList(); 
return Json(results, JsonRequestBehavior.AllowGet); 

Ошибка возникает во второй строке при вызове Json(). Однако я не могу понять, какое свойство вызывает проблему. Я просмотрел список результатов перед вызовом, и все выглядит нормально. Есть определенные свойства null, но ни один из них не требуется.

Я включу вывод ошибки ниже (хотя его формат не хорошо форматируется). Кажется не очень очевидным, что именно вызывает проблему - как я могу понять, где проблема?

Ошибки Текст

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Data.SqlTypes.SqlNullValueException: Data is Null. This method or property cannot be called on Null values. 
at System.Data.SqlTypes.SqlDouble.get_Value() 
--- End of inner exception stack trace --- 
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) 
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) 
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 
at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters) 
at System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat) 
at System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember) 
at System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember) 
at System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat) 
at System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember) 
at System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember) 
at System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat) 
at System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember) 
at System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember) 
at System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat) 
at System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember) 
at System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember) 
at System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat) 
at System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember) 
at System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember) 
at System.Web.Script.Serialization.JavaScriptSerializer.SerializeEnumerable(IEnumerable enumerable, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat) 
at System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember) 
at System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember) 
at System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object obj, SerializationFormat serializationFormat) 
at System.Web.Mvc.JsonResult.ExecuteResult(ControllerContext context) 
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19() 
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) 
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) 
at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) 

и вот моя ПОКО модель:

public class Church : IUserTrackingEntity 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    [Display(Name="Denomination")] 
    public int? DenominationId { get; set; } 
    public Denomination Denomination { get; set; } 
    [Display(Name="Web Address")] 
    public string WebAddress { get; set; } 
    public string Contact { get; set; } 
    [Display(Name="Position")] 
    public int? ContactPositionId { get; set; } 
    public ContactPosition ContactPosition { get; set; } 
    [Display(Name="Email")] 
    public string EmailAddress { get; set; } 
    [Display(Name="Phone Number")] 
    public string PhoneNumber { get; set; } 
    [Display(Name="Ext.")] 
    public string PhoneExtension { get; set; } 
    [Display(Name="Phone Type")] 
    public int? PhoneNumberTypeId { get; set; } 
    [Display(Name = "Country")] 
    public int? CountryId { get; set; } 
    public Country Country { get; set; } 
    [Display(Name = "Partnership Requested")] 
    public DateTime? PartnershipRequestDate { get; set; } 
    [Display(Name = "Partnership Accepted")] 
    public DateTime? PartnershipAcceptDate { get; set; } 
    [Display(Name = "Last Contacted")] 
    public DateTime? LastContactDate { get; set; } 
    public string Notes { get; set; } 
    public string LastChangedBy { get; set; } 
    public int? AddressId { get; set; } 
    public Address Address { get; set; } 
} 
    public class Country 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Continent { get; set; } 
    public string PostalCodeFormat { get; set; } 
    public string PostalCodeRegex { get; set; } 
    public string Citizenship { get; set; } 
    public string NTMCode { get; set; } 
    public string ISOCode { get; set; } 
    public string ISO3Code { get; set; } 
    public string FIPSCode { get; set; } 
} 
    public class Address : IUserTrackingEntity 
{ 
    public int Id { get; set; } 
    public string Addressee { get; set; } 
    [Required(ErrorMessage = "A value must be entered into street 1.")] 
    public string Street1 { get; set; } 
    public string Street2 { get; set; } 
    public string Locality { get; set; } 
    public string District { get; set; } 
    [Required(ErrorMessage="A Country is required.")] 
    public int CountryId { get; set; } 
    public Country Country { get; set; } 
    public string PostalCode { get; set; } 
    public bool IsVerified { get; set; } 
    public string NTMId { get; set; } 
    public string LastChangedBy { get; set; } 
    public DbGeography Location { get; set; } 

    public double? Longitude 
    { 
     get 
     { 
      return Location == null ? null : Location.Longitude; 
     } 

     set 
     { 
      if (value != null) 
       Location = DbGeography.FromText(String.Format("POINT({0} {1})", value, Latitude ?? 0d), 4326); 
     } 
    } 
    public double? Latitude 
    { 
     get 
     { 
      return Location == null ? null : Location.Latitude; 
     } 

     set 
     { 
      if (value != null) 
       Location = DbGeography.FromText(String.Format("POINT({0} {1})", Longitude ?? 0d, value), 4326); 
     } 
    } 

} 
+0

Работает ли он, если вы поместите атрибут '[ScriptIgnore]' в свойство 'Address.Location'? –

+0

Вот и все! Спасибо. Если вы опубликуете это как ответ, я пойду дальше и отметю его. – RHarris

ответ

4

Исключение, вероятно, появляющийся при попытке Serializer JSON сериализации экземпляра DbGeography в Address.Location. Некоторое (double -значное и лениво разрешенное) свойство этого экземпляра недопустимо для местоположения, которое представляет экземпляр, но сериализатор этого не знает и идет вперед и пытается получить доступ к этому свойству, которое вызывает исключение.

Добавление атрибута [ScriptIgnore] в собственность Address.Location должно быть исправлено.

+0

Другим вариантом является преобразование Json.Net в ваш ответ. См. Http://stackoverflow.com/a/25197400/469777 –

Смежные вопросы