2011-11-02 38 views
11

Tôi có một thực thể khung thực thể mà tôi muốn tuần tự hóa như một đối tượng json. Tôi nhìn xung quanh và phát hiện ra rằng json.net (http://james.newtonking.com/projects/json-net.aspx) sẽ có thể sắp xếp các đối tượng với tham chiếu vòng tròn "ra khỏi hộp". Vì vậy, tôi đã thử sử dụngjson.net; serialize đối tượng khung thực thể (lỗi tham chiếu vòng tròn)

string json = JsonConvert.SerializeObject(/* my ef entity */); 

Nhưng vẫn nhận được lỗi tương tự. Vấn đề có thể là tôi cần phải sử dụng ReferenceLoopHandling.Ignore và một số ContractResolver, nhưng tôi không chắc chắn cách sử dụng chúng. Bất kỳ sự giúp đỡ nào cũng được đánh giá cao! Cảm ơn

+0

thể trùng lặp của [Serialize Entity Framework đối tượng vào JSON] (http://stackoverflow.com/questions/657939/serialize-entity-framework-objects-into- json) –

+2

@CraigStuntz no, bởi vì tôi không muốn ánh xạ các thuộc tính maunally trên một đối tượng mới. Và im hỏi làm thế nào điều này có thể được thực hiện bằng cách sử dụng JSON.NET – Johan

+0

Giải pháp được đề xuất sẽ làm việc cho JSON.NET.Nếu bạn thực sự muốn đối phó với các tham chiếu vòng tròn hơn là một tuyên bố chuyển nhượng, tốt, đó là vào bạn. Nhưng JSON.NET không có nghĩa là giải pháp khác sẽ không hoạt động. –

Trả lời

2

Giải pháp của tôi là chỉ cần xóa tham chiếu gốc trên các thực thể con của tôi.

Vì vậy, trong mô hình của mình, tôi đã chọn mối quan hệ và thay đổi Tham chiếu gốc thành Nội bộ thay vì Công khai.

Có thể không phải là giải pháp lý tưởng cho tất cả, nhưng làm việc cho tôi.

14

Để giải quyết vấn đề này, tôi đã chuyển đổi Thực thể của mình thành Mã dựa trên POCO trước tiên. Để thực hiện việc này, nhấp chuột phải bên trong cửa sổ edmx của bạn và chọn:

Thêm mục tạo mã> Tab mã> Máy phát điện thực thể POCO EF.

Lưu ý rằng bạn có thể cần phải cài đặt nó với nuget nếu bạn không nhìn thấy nó.

Tuy nhiên, khi chạy, EF bổ sung các lớp proxy cho các đối tượng đó cho mục đích theo dõi nhưng chúng có xu hướng lộn xộn với quá trình tuần tự hóa. Để ngăn chặn điều này chúng ta có thể dễ dàng thiết lập ProxyCreationEnabled false như sau:

var context = new YourEntities(); 
context.Configuration.ProxyCreationEnabled = false; 

var results = context.YourEntity.Take(100).ToList(); 

Sau đó bạn có thể trở lại JSON.NET dữ liệu tuần tự an toàn bằng cách bỏ qua các tài liệu tham khảo mặc định vòng lặp như sau:

return JsonConvert.SerializeObject(results, Formatting.Indented, 
    new JsonSerializerSettings { 
     ReferenceLoopHandling = ReferenceLoopHandling.Ignore 
    }); 
+4

+1 cho 'ReferenceLoopHandling.Ignore' - đã lưu ngày của tôi! – nrodic

1

Hãy thử điều này: Đầu tiên đảm bảo poco hoặc mô hình có DataContract, DataMemeber và loại bỏ word..then virtual key ..

public string Get() 
    { 
     var list = _languageRepository.GetMany(l => l.LanguageTrans.FirstOrDefault().CultureCode == "en").ToList(); 

     string json = JsonConvert.SerializeObject(list, Formatting.Indented, new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects }); 

     return json; 
    } 
+0

Bằng cách này bạn có thể giữ các thực thể liên quan ... – Bryant

9

Một giải pháp khác sẽ được thêm [JsonIgnore] attribut e cho các thuộc tính điều hướng của bạn.

Ví dụ:

using System; 
using System.ComponentModel.DataAnnotations.Schema; 

[Serializable] 
public class Entity 
{ 
    public int EntityID { get; set; } 
    public string EntityName { get; set; } 

    [JsonIgnore] 
    public virtual Parent Parent { get; set; } 
    [JsonIgnore] 
    public virtual List<Child> Children { get; set; } 
} 
+0

Đây là câu trả lời đúng, các thực thể nên tham khảo lẫn nhau. Nhưng bạn cần bỏ qua thuộc tính thực thể chính trong phần tử con. – Darren

+1

Nhưng nếu tôi muốn xem mối quan hệ từ quan điểm của phần tử con? –

6

tôi đã sử dụng các giải pháp sau đây để sao chép các đối tượng của tôi, không có thủ thuật khi cần liên quan đến dữ liệu thuộc tính trên các thực thể và bảng tham chiếu vòng tròn của tôi đã bảo quản. Tôi thậm chí còn có các thực thể trỏ đến mỗi witout khác bất kỳ vấn đề. Thư viện bắt buộc cho serializaton là Json.Net (tệp Newtonsoft.Json). sử dụng

private static T CloneObject<T>(T obj) 
    { 
     if (obj == null) 
      return obj; 
     string ser = JsonConvert.SerializeObject(obj, Formatting.Indented, 
      new JsonSerializerSettings() { 
           NullValueHandling = NullValueHandling.Ignore, 
           MissingMemberHandling = MissingMemberHandling.Ignore, 
           ReferenceLoopHandling = ReferenceLoopHandling.Ignore}); 
     return (T) JsonConvert.DeserializeObject(ser, obj.GetType()); 
    } 

Ví dụ:

protected object CopyObj(Object obj) 
    { 
     return CloneObject(obj); 
    } 
    var cust1 = this.cts.Customers().Where(cc => cc.Id == 3).Include(cc => cc.Addresses).FirstOrDefault(); 
    var cust2 = CopyObj(cust1) as Customers; 
    //Cust2 now includes copies of the customer record and its addresses 
Các vấn đề liên quan