5

JSON Serileştirme (ASP.Net Web API) özyinelemeli döngü nedeniyle başarısız oluyor (bu yaygın bir sorun, Sebep: bir öğenin tembel yükler talep etmesidir Çocuk varlıkları ve her çocuğun ana kuruluşa geri göndermesi vardır).JSON Serileştirme Varlık Çerçevesi Kendi Referans Döngü hatası Açık bir şekilde kullanıldığında ProxyCreation yanlış bildirildikten sonra bile

Çalışma etrafında buldum, ama bana yardımcı olmuyor:

  1. Use [JsonIgnore] for navigation properties to be ignored: Bu çözüm çalışmalarını ancak benim durumumda geçerli değildir. Örneğin: Siparişleri ile birlikte bir Müşteri bilgisi almak için, Sipariş sınıfındaki Müşteri mülküne hızlı bir şekilde [JsonIgnore] eklerdim, ancak Müşteri bilgileriyle birlikte bir Sipariş bilgisi almak istediğimde, Müşteri mülkünde [JsonIgnore] olduğundan Müşteri detaylarını içermez. Dairesel başvurulan verilere gerek duymadığım için koruyamıyorum
  2. Change JSON.Net Serializer Settings to Preserve References:
  3. Disable Proxy Creation at the Data Context and use explicit loading(this should ideally solve the problem): Proxy oluşturmayı devre dışı bırakma işlemi durur Lazy Verileri yükleme ve geri döndürür, ancak açık bir şekilde Çocuk varlıkları dahil ettiğimde, beklenmedik kendi kendini yönlendirme döngüsü hatası alırım! Hata, ana varlık için arka referans düzeyinde.

Aynı çizgiler/önerilerdeki deneyimler?

+0

Lütfen modelinizin bazı kodlarını gönderin –

cevap

3

tüm önerilen çözümleri denedim ama işe yaramadı. Buna JSON.Net Serializer en DefaultContractResolver geçersiz kılma ile sona erdi:

public static class CriteriaDefination 
{ 
    private static Dictionary<string, Dictionary<Type, List<string>>> ToIgnore = new Dictionary<string, Dictionary<Type, List<string>>> 
    { 
     { 
      "tblCustomer", new Dictionary<Type, List<string>>{ 
       { 
        typeof(tblCustomer), new List<string>{ 
         //include all 
        } 
       }, 
       { 
        typeof(tblOrder), new List<string>{ 
         "tblCustomer"//ignore back reference to tblCustomer 
        } 
       } 
      } 
     }, 
     { 
      "tblOrder", new Dictionary<Type, List<string>>{ 
       { 
        typeof(tblCustomer), new List<string>{ 
         "tblOrders"//ignore back reference to tblOrders 
        } 
       }, 
       { 
        typeof(tblOrder), new List<string>{ 
         //include all 
        } 
       } 
      } 
     } 
    }; 
    public static Dictionary<Type, List<string>> IgnoreList(string key) 
    { 
     return ToIgnore[key]; 
    } 
} 

Ve her denetleyici içinde:

public class FilterContractResolver : DefaultContractResolver 
{ 
    Dictionary<Type, List<string>> _propertiesToIgnore; 

    public FilterContractResolver(Dictionary<Type, List<string>> propertiesToIgnore) 
    { 
     _propertiesToIgnore = propertiesToIgnore; 
    } 

    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) 
    { 
     var property = base.CreateProperty(member, memberSerialization); 
     List<string> toIgnore; 
     property.Ignored |= ((_propertiesToIgnore.TryGetValue(member.DeclaringType, out toIgnore) || _propertiesToIgnore.TryGetValue(member.DeclaringType.BaseType, out toIgnore)) && toIgnore.Contains(property.PropertyName)); 
     return property; 
    } 
} 

Sonra Yok Sayılan Denetleyici dayalı olması Özellikleri sözlüğü döndüren bir statik sınıfı yarattı JSON Biçimlendiriciyi aşağıdaki gibi değiştirin:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new FilterContractResolver(CriteriaDefination.IgnoreList("tblCustomer")); 
2

Yerleşmeye son verdiğim şey budur, umarım bir başkasına yardım eder.

public partial class MyEF 
{ 
    public virtual ICollection<MyOtherEF> MyOtherEFs {get; set;} 
} 
public partial class MyOtherEF 
{ 
    public virtual MyEF MyEF {get; set;} 
} 

, Json.NET oluyor serileştirme formu tutmak için sınıfı genişletip şöyle adı "ShouldSerialize" + özellik adı ile bir yöntemi ekleyebilirsiniz:

EF sınıfları böyle yapılandırılmıştır Say : Eğer biraz daha süslü olsun istedim Eğer bazı durumlarda serileştirebilir böylece

public partial class MyEF 
{ 
    public bool ShouldSerializeMyOtherEFs() { return false; } 
} 

, sen yönteminde mantığı ekleyebilirsiniz. Bu, bu kod farklı bir fiziksel kod dosyasında olduğu sürece, serileştirme mantığını EF Model First kod yaratımından uzak tutmanıza olanak tanır.

İlgili konular