Я видел несколько потоков, касающихся этого, но ни один из них, похоже, не помогает в моем случае. Я запрашиваю (с 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);
}
}
}
Работает ли он, если вы поместите атрибут '[ScriptIgnore]' в свойство 'Address.Location'? –
Вот и все! Спасибо. Если вы опубликуете это как ответ, я пойду дальше и отметю его. – RHarris