2012-10-10 28 views
12

Đang cố gắng câu hỏi này một lần nữa bởi vì nỗ lực đầu tiên của tôi là hầu như không mạch lạc: pEntity Framework Thông tư tham khảo

Vì vậy, tôi siêu bối rối và sử dụng Entity Framework Mã Đầu tiên

Tôi có một lớp rừng.

Tôi có lớp Cây.

Mỗi Forest có thể có nhiều cây

Khi tôi đang cố gắng để serialize tôi đã nhận được tham chiếu vòng tròn

public class Forest 
{ 

    public Guid ID { get; set; } 
    public virtual List<Tree> Trees { get; set; } 
} 
public class Tree 
{ 
    public Guid ID { get; set; } 
    public Guid? ForestId {get;set;} 

    [ForeignKey("ForestId")] 
    public virtual Forest Forest {get;set;} 
} 

Mỗi rừng có cây nhưng không phải mọi cây trong một khu rừng. Tôi đấu tranh với một trong hai lỗi của Multiplicity khi làm

@(Html.Raw(Json.Encode(Model))) 

Trong trường hợp mô hình là một rừng

và nếu tôi làm ForestId một Guid thay vì một Guid? tôi nhận được lỗi tham khảo Thông tư.

Tôi cũng đã cố gắng protected override trống

OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Forest>() 
    .HasMany(x => x.Tree) 
    .WithOptional() 
    .HasForeignKey(y => y.ForestId); 
} 

Cảm ơn trước

+0

Bạn đang sử dụng DataContractSerializer? Nếu vậy, tôi không thấy DataContracts của bạn, nhưng bạn sẽ cần phải thiết lập IsReference = true. –

Trả lời

16

cách tiếp cận tốt nhất sẽ là bạn nên sử dụng DTOs chỉ chuyển giao dữ liệu mà bạn muốn cho khách hàng. Các DTO chỉ nên có các thuộc tính đơn giản để nó không tạo ra lỗi tham chiếu vòng tròn. Tại thời điểm này Rừng có List<Trees> Trees và mỗi Tree trong Cây có ForestForest lại có List<Trees>

Hoặc

Bạn có thể trang trí thuộc tính của bạn với ScriptIgnore đối với tài sản mà bạn không muốn Json. Mã hóa để serialize và sau đó sẽ không được gửi lại cho khách hàng.

http://msdn.microsoft.com/en-us/library/system.web.script.serialization.scriptignoreattribute.aspx

Ví dụ:

public class Forest 
{  
    public Guid ID { get; set; } 
    public virtual List<Tree> Trees { get; set; } 
} 
public class Tree 
{ 
    public Guid ID { get; set; } 
    public Guid? ForestId {get;set;} 

    [ForeignKey("ForestId")] 
    [ScriptIgnore] 
    public virtual Forest Forest {get;set;} 
} 

Edit:

Cùng với ScriptIgnore bạn cũng nên loại bỏ virtual từ ForestTrees và đó sẽ làm việc. Tôi đã thử nghiệm nó. Tuy nhiên, tôi sẽ không khuyên rằng vì từ khóa ảo là tải Lazy. Do đó, như tôi đã nói bạn cần tạo DTO dựa trên những Mô hình này và chỉ gửi DTO cho khách hàng.

+0

Ngay cả với Script bỏ qua nó đã cho tôi tham khảo vòng tròn vì vậy tôi nhìn vào mô hình. Trường ID cho cây tiếp tục khoan xuống cũng như trường ID cho Forest. Tôi đang sử dụng GUID được tạo trong cơ sở dữ liệu bằng cách sử dụng NewId() điều này có thể gây ra sự cố của tôi không? Tôi thậm chí đặt Trees = null trong Forest và nó vẫn đưa ra một tham chiếu vòng tròn. – Jordan

+0

@Jordan: xem chỉnh sửa của tôi. – TCM

+0

Cảm ơn bạn rất nhiều. Cuối cùng tôi đã nhận ra đêm qua tôi có thể thực hiện ảo. Tôi nhận ra nó không phải là giải pháp lý tưởng nhưng tôi chỉ đang tạo mẫu cho dự án này vì vậy trong trường hợp này nó là tốt. Trong công việc sản xuất trong tương lai, tôi thực sự sẽ sử dụng DTO! Cảm ơn bạn rất nhiều! – Jordan