Entity Framework İlişkili Nesnelerin Json’a Seriliaze Edilmesi

Selam Arkadaşlar,

Bilindiği üzere entity framework gibi ORM toollarının  temel kullanım amaçlarından birisi nesnelerimizin ilişkili bir şekilde veritabanına yansıtma işlemini yapması veya veritabanındaki ilişkili tablolarımızın bu nesnelere map edilme işleminin yapılmasıdır.

Örnek senaryomuzda “Category” isimli ürün kategorilerinin tutulduğu bir tablo ile “Product” isimli bir tablomuz olduğunu farzedelim.İlişkilendirme işlemini yaparken “ProductCategory” içerisinde List<Product> Products propertymiz yer alacaktır ve Product’da ise ProductCategory Category tipinde bir propertyimiz yer alacak.

Biz veritabanımızdan herhangi bir sorgu kriterine göre bir sorgu yazıp products tablomuzdan entity çektiğimizde gelen entitye ait kategoriler Category içerisinde listelenecektir (context optionsdan LazyLoading’i  etkin olduğu takdirde). Fakat product altındaki category altında tekrardan bu kategoriye ait ürünlerin listelendiğini yani iç içe sonsuz bir döngü benzeri bir yapı oluşacaktır ve bun objectin Web Api ile Json’a serilization’u yapıldığı zaman haliyle aşağıdaki gibi bir hatayla karşılalacağız.

{“Message”:”An error has occurred.”,”ExceptionMessage”:”The ‘ObjectContent`1’ type failed to serialize the response body for content type ‘text/html; charset=utf-8’.”,”ExceptionType”:”System.InvalidOperationException”,”StackTrace”:null,”InnerException”:{“Message”:”An error has occurred.”,”ExceptionMessage”:”Self referencing loop detected with type ‘System.Data.Entity.DynamicProxies.Product_07AE338A55E0F6538637A4A492DEBECB7E902E68AD7C46A6095D3CF9AF700C3C’. Path ‘Result[0].Product’.”,”ExceptionType”:”Newtonsoft.Json.JsonSerializationException”,”StackTrace”:” at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CheckForCircularReference(JsonWriter writer, Object value, JsonProperty property, JsonContract contract, JsonContainerContract …..

 

Bu sorunu çözüme kavuşturmak çok basit.Web Api konfigürasyon dosyamıza(“WebApiConfig.cs”) ya da json serializer ayarlarını yaptığınız kısıma aşağıdaki kodu eklemek 🙂

 

 

Bir cevap bırakın
Son Yazılar