2011-01-21 42 views
12

Có bài đăng here yêu cầu cách giải quyết lỗi tham chiếu vòng tròn khi trả về đối tượng được tuần tự hóa qua EF4 CTP5. Tôi chạy vào cùng một vấn đề này với một dự án biểu mẫu web WCF một thời gian trở lại.Làm cách nào để giải quyết lỗi tham chiếu tuần tự hóa Json?

Tôi đã có thể "giải quyết" vấn đề này trong dự án biểu mẫu WCF/web của tôi và trong dự án MVC3 của tôi. Tôi không nghĩ nó quan trọng như thế nào khi dự án này xuất hiện để trở thành một "sự kiện" của EF.

tôi giải quyết vấn đề bằng cách tắt ProxyCreation trong constructor ObjectContext của tôi như thế này:

public class MyObjectContext : DbContext, IDbContext 
{ 
    public MyObjectContext(string connectionStringName) : base(connectionStringName) 
    { 
     ((IObjectContextAdapter)this).ObjectContext.ContextOptions.ProxyCreationEnabled = false; 
    } 
    public DbSet<Product> Products {get;set;} 
    //etc. 
} 

Câu hỏi của tôi là: Có thể ai đó giải thích tại sao điều này dường như sẽ giải quyết vấn đề?

Tôi nghĩ rằng vấn đề phải liên quan đến các thuộc tính điều hướng trong POCO của tôi nhưng sau đó tôi bị bối rối. Cảm ơn.

+3

+1 chỉ vì tiêu đề của bạn làm tôi mỉm cười! :-) –

+0

Bạn không thể giả vờ mình biết những gì bạn đang nói ở nơi này. Tốt nhất là trung thực. Cảm ơn vì +1. – trevorc

Trả lời

9

Nếu bạn tắt tạo proxy, bạn cũng sẽ tắt tải chậm. Khi serialization của thực thể xảy ra nó truy cập tất cả các thuộc tính chuyển hướng. Nếu tải chậm được kích hoạt nó tải tất cả các đối tượng liên quan và cố gắng để sắp xếp chúng là tốt. Một lần nữa nó truy cập tất cả các thuộc tính của chúng bao gồm các thuộc tính điều hướng trỏ ngược trở lại đối tượng cha. Tại thời điểm này, bạn phải nói serialization rằng thuộc tính này là tham chiếu vòng tròn hoặc nó sẽ tuần tự hóa đối tượng một lần nữa và tiếp tục trong vòng lặp vô hạn.

Bí quyết ở đây có thể là chú thích thuộc tính điều hướng tròn của bạn trong thực thể con với thuộc tính ScriptIgnore.

+0

Điều đó có ý nghĩa hoàn hảo. Tôi nghĩ rằng nó đã liên quan đến tải chậm nhưng tôi đã không nhận ra rằng proxy tạo ra tắt tải lười biếng. Câu trả lời chính xác! Cảm ơn. – trevorc

+2

ScriptIgnore không hoạt động, nó có thể hoạt động nếu bạn vô hiệu hóa việc tạo proxy khó khăn. – hazimdikenli

-1

lưu ý nhanh: nếu bạn vẫn còn đối mặt với những ngoại lệ nhớ loại bỏ

.Include("NestedObject")

Bằng cách này mối quan hệ cha-con sẽ biến mất cũng như các ngoại lệ

1

Các tham chiếu vòng tròn xảy ra bởi vì bạn sử dụng tải mong muốn trên đối tượng.

Bạn có một vài phương pháp:

  • Tắt tải háo hức khi tải của bạn truy vấn của bạn (LINQ hoặc lambda) DbContext.Configuration.ProxyCreationEnabled = false;
  • Tháo khóa ảo từ Domainmodel
  • Bao gồm chúng trong khi tải các đối tượng
  • Tháo đối tượng (= không có chức năng tải háo hức & không có proxy)
    • Repository.Detach (entityObject)
    • DbContext. Mục nhập (entityObject) .EntityState = EntityState.Detached
  • Sao chép các thuộc tính
    • Bạn có thể sử dụng một cái gì đó như AutoMapper để sao chép đối tượng, không sử dụng giao diện ICloneable, bởi vì nó cũng nhân bản ProxyProperties trong đối tượng, do đó sẽ không hoạt động.
  • Trong trường hợp bạn đang xây dựng một API, hãy thử sử dụng một dự án separte với cấu hình khác nhau (mà không trả lại proxy)

PS. Proxy là đối tượng được tạo bởi EF khi bạn tải nó từ khung Entity. Tóm lại: Nó có nghĩa là nó giữ các giá trị ban đầu và các giá trị cập nhật để chúng có thể được cập nhật sau này. Nó xử lý những thứ khác để ;-)

Các vấn đề liên quan