EF 4.1 - İlk - JSON Dairesel Referans Kodu Seri hale getirme Hatası
Bildiğim kadarıyla herhangi bir döngüsel başvuru var, ancak Dairesel Referans Seri bir Hata alıyorum. Veritabanından bir dizi Emir almak ve JSON olarak istemci için onları gönderiyorum. Tüm kod aşağıda gösterilmiştir.
Bu hata:
Hata
Döngüsel bir başvuru algılandı türünde bir nesne seri hale getirilirken 'System.Data.Entity.DynamicProxies.'.Order_83CECF2AA4DE38232F9077D4B26941ab96bc61230419ea8ac42c9100e6072812 Açıklama: işlenmeyen Bir özel durum bu yürütme sırasında bir hata oluştu geçerli web isteği. Lütfen Gözden geçir stack hakkında daha fazla bilgi için izleme başlatıldığı hata ve kod.
Özel Durum Ayrıntıları: Sistem.Invalidoperationexception: döngüsel başvuru yaparken tespit edildi seri türde bir nesne 'System.Data.Entity.DynamicProxies.'. Order_83CECF2AA4DE38232F9077D4B26941ab96bc61230419ea8ac42c9100e6072812
Kaynak Hatası:
İşlenmeyen bir özel durum oluşturuldu mevcut yürütülürken web isteği. İlgili bilgiler özel kökeni ve konumu belirlenebilir dışında kullanarak aşağıdaki yığın izleme.
Benim sınıfları aşağıdaki gibidir:
Sipariş
public class Order
{
[Key]
public int OrderId { get; set; }
public int PatientId { get; set; }
public virtual Patient Patient { get; set; }
public int CertificationPeriodId { get; set; }
public virtual CertificationPeriod CertificationPeriod { get; set; }
public int AgencyId { get; set; }
public virtual Agency Agency { get; set; }
public int PrimaryDiagnosisId { get; set; }
public virtual Diagnosis PrimaryDiagnosis { get; set; }
public int ApprovalStatusId { get; set; }
public virtual OrderApprovalStatus ApprovalStatus { get; set; }
public int ApproverId { get; set; }
public virtual User Approver { get; set; }
public int SubmitterId { get; set; }
public virtual User Submitter { get; set; }
public DateTime ApprovalDate { get; set; }
public DateTime SubmittedDate { get; set; }
public Boolean IsDeprecated { get; set; }
}
Hasta
public class Patient
{
[Key]
public int PatientId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string MiddleInitial { get; set; }
public bool IsMale;
public DateTime DateOfBirth { get; set; }
public int PatientAddressId { get; set; }
public Address PatientAddress { get; set; }
public bool IsDeprecated { get; set; }
}
Sertifika Dönemi
public class CertificationPeriod
{
[Key]
public int CertificationPeriodId { get; set; }
public DateTime startDate { get; set; }
public DateTime endDate { get; set; }
public bool isDeprecated { get; set; }
}
Ajans
public class Agency
{
[Key]
public int AgencyId { get; set; }
public string Name { get; set; }
public int PatientAddressId { get; set; }
public virtual Address Address { get; set; }
}
Tanı
public class Diagnosis
{
[Key]
public int DiagnosisId { get; set; }
public string Icd9Code { get; set; }
public string Description { get; set; }
public DateTime DateOfDiagnosis { get; set; }
public string Onset { get; set; }
public string Details { get; set; }
}
OrderApprovalStatus
public class OrderApprovalStatus
{
[Key]
public int OrderApprovalStatusId { get; set; }
public string Status { get; set; }
}
Kullanıcı
public class User
{
[Key]
public int UserId { get; set; }
public string Login { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string NPI { get; set; }
public string Email { get; set; }
}
NOT: DÜZENLEME SIRASINDA . SINIF YENİ EK ADRESİ
Adres
public class Address
{
[Key]
public int AddressId { get; set; }
public string StreetAddress { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Zip { get; set; }
public string Phone { get; set; }
public string Title { get; set; }
public string Label { get; set; }
}
Serileştirme yürüten kod burada:
OrderController alıntı
public ActionResult GetAll()
{
return Json(ppEFContext.Orders, JsonRequestBehavior.AllowGet);
}
Teşekkürler
CEVAP
Tüm navigasyon özellikleri virtual
anahtar tembel yükleme ve proxy oluşturmayı devre dışı bırakmak ve istekli yüklemek yerine gerekli nesne grafiği explicitely yüklemek için kullanın kaldırmak için deneyebilirsiniz:
public ActionResult GetAll()
{
return Json(ppEFContext.Orders
.Include(o => o.Patient)
.Include(o => o.Patient.PatientAddress)
.Include(o => o.CertificationPeriod)
.Include(o => o.Agency)
.Include(o => o.Agency.Address)
.Include(o => o.PrimaryDiagnosis)
.Include(o => o.ApprovalStatus)
.Include(o => o.Approver)
.Include(o => o.Submitter),
JsonRequestBehavior.AllowGet);
}
** 25 uygulama gibi görünüyor atıfta nesne grafiği tembel yük var sanal özelliklerini, muhtemelen şimdi de seri hale getirme sorunu yaratan sen tanıştırdın çünkü tembel yükleme zaten güvenmek değil.
Edit
Gerekli navigasyon özellikleri virtual
anahtar tembel yükleme modeli için tamamen imkansız kılacak bir şekilde kaldırmak için değil. Yeterince yakınlık, seri hale getirme gibi rahatsız edici olduğu özel durumlar için proxy oluşturma gibi tembel yükleme devre dışı) devre dışı bırakmak için:
ppEFContext.Configuration.ProxyCreationEnabled = false;
Bu özel bağlam örneği ppEFContext
sadece proxy oluşturma devre dışı bırakır.
(Sadece, @WillC zaten burada bahsedilen gördüm. Upvote için bu cevabı Düzenle lütfen.)
Bir alan boyunca görmezden .NET JSON s...
Nasıl JAXB nesnelerin listesini JSON i...
Nerede sistemidir.Çalışma zamanı.Seri ...
Seri hale getirilirken PHP JSON nesnes...
Nasıl bir C seri hale ben# bir JSON di...