2012-10-10 23 views
12

: pVarlık Framework Dairesel Referans

Böylece bir orman sınıf var Varlık Framework Kod İlk

kullanarak süper karışık ve duyuyorum.

Ağaç sınıfım var. Ben

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

Her orman ağaçları vardır ama her ağacın ormanda döngüsel bir başvuru başlamıştı seri çalışıyordu zaman

Her Orman birçok Ağaçlar

sahip olabilir. model orman

olduğunu

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

yaparken ben Multiplicity birini hatalarla mücadele ve yerine bir Guid? ait ForestId bir Guid yaparsanız ben Dairesel Referans hataları olsun.

Ben de size müşteriye sadece istediğiniz veri aktarmak için DTOs kullanmalıdır olacağını protected override void peşin

+0

DataContractSerializer kullanıyor musunuz? Öyleyse, DataContracts'ınızı göremiyorum, ancak IsReference = true değerini ayarlamanız gerekecek. –

cevap

16

iyi yaklaşım içinde

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

Teşekkür çalıştı. DTO'lar yalnızca basit özelliklere sahip olmalı, bu yüzden dairesel bir referans hatası oluşturmayacaktır. Şu anda Orman List<Trees> Trees vardır ve Ağaçlar içindeki her TreeForest vardır ve bu Forest tekrar Sen Json istemiyoruz özellikleri için ScriptIgnore ile özelliklerini dekore edebilirsiniz List<Trees>

Ya

sahiptir. Serileştirmek için kodlayın ve sonra istemciye geri gönderilmez.

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

Örn:

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

Düzenleme:

ScriptIgnore ile birlikte aynı zamanda Forest ve Trees den virtual kaldırmalısınız ve bu işe yarar. Bunu test ettim. Bununla birlikte, bunu tavsiye etmem çünkü sanal anahtar kelime Lazy'nin yüklenmesi. Bu nedenle, bu Modellere dayanarak DTO'lar oluşturmanız ve sadece müşteriye DTO göndermeniz gerektiğini söyledim.

+0

Komut dosyası ile göz ardı etse bile, modele baktığımda bana dairesel referans verdi. Ağaç için ID alanı, Orman için kimlik alanı gibi sondaj yapmaya devam ediyor. NewId() kullanarak veritabanında oluşturulan GUID'leri kullanıyorum bu sorunuma neden olabilir mi? Ormanları bile ormanda = null olarak ayarladım ve hala dairesel bir referans veriyor. – Jordan

+0

@Jordan: düzenlememe bak. – TCM

+0

Çok teşekkür ederim. Dün geceyi gerçekleştirmeyi bitirdim ve sanallığı kapatabilirdim. İdeal bir çözüm olmadığını anlıyorum ama bu proje için sadece prototip yapıyorum, bu yüzden bu örnekte gayet iyi. Gelecekteki üretim işlerinde gerçekten DTO'ları kullanacağım! Çok teşekkür ederim! – Jordan