5

JSON serialization (ASP.Net Web API) không thành công do vòng lặp tham chiếu (đó là một vấn đề phổ biến). các thực thể con và mọi trẻ có tham chiếu ngược về thực thể cha mẹ).Nhận lỗi lặp vòng lặp thực thể JSON Lỗi tham chiếu vòng lặp tự do ngay cả sau khi ProxyCreation sai khi sử dụng cách rõ ràng bao gồm

làm việc xung quanh tôi thấy, nhưng không giúp tôi:

  1. Use [JsonIgnore] for navigation properties to be ignored: giải pháp này hoạt động nhưng không áp dụng trong trường hợp của tôi. Ví dụ: Để có được thông tin Khách hàng cùng với Đơn đặt hàng, tôi sẽ nhanh chóng thêm [JsonIgnore] vào thuộc tính Khách hàng trong lớp Đặt hàng, nhưng khi tôi muốn nhận thông tin Đơn hàng cùng với chi tiết Khách hàng, vì có [JsonIgnore] về thuộc tính Khách hàng , nó sẽ không bao gồm chi tiết Khách hàng.
  2. Change JSON.Net Serializer Settings to Preserve References: Không thể bảo tồn vì tôi không cần dữ liệu được tham chiếu Thông tư.
  3. Disable Proxy Creation at the Data Context and use explicit loading(this should ideally solve the problem): Tắt tính năng tạo proxy dừng tải và trả về dữ liệu mà không có lỗi, nhưng khi tôi bao gồm rõ ràng thực thể con, tôi lại gặp lỗi vòng lặp tự tham chiếu không mong muốn! Lỗi ở cấp độ tham chiếu ngược đối với thực thể cha.

Bất kỳ trải nghiệm nào có cùng dòng/đề xuất?

+0

Vui lòng đăng một số mã của mô hình của bạn –

Trả lời

3

Tôi đã thử tất cả các giải pháp đề xuất nhưng đã không làm việc. Đã kết thúc với Trọng DefaultContractResolver các JSON.Net Serializer để này:

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; 
    } 
} 

Sau đó, tạo ra một lớp tĩnh mà trả về một cuốn từ điển của Properties để được Ignored dựa trên Bộ điều khiển:

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]; 
    } 
} 

Và bên trong mỗi điều khiển thay đổi Định dạng JSON một cái gì đó như:

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

Thay vì cho phép khung thực thể tạo mô hình, sử dụng mã đầu tiên với cơ sở dữ liệu hiện có. Bây giờ bạn có nhiều quyền kiểm soát hơn.

See this blog entry from Scott Guthrie

2

Đây là thứ tôi đã kết thúc, hy vọng nó sẽ giúp người khác.

Giả sử các lớp học EF được cấu trúc như thế này:

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

Để giữ hình thức serialization xảy ra trong JSON.NET, bạn có thể mở rộng các lớp và thêm một phương thức với cái tên "ShouldSerialize" + tên thuộc tính như vậy :

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

Nếu bạn muốn yêu thích hơn một chút, bạn có thể thêm logic vào phương pháp để nó sẽ được sắp xếp theo thứ tự trong một số trường hợp nhất định. Điều này cho phép bạn giữ logic tuần tự hóa từ việc tạo mã EF Model First miễn là mã này nằm trong một tệp mã vật lý khác.