2012-10-10 20 views
12

Trying to pytanie ponownie, ponieważ moja pierwsza próba była ledwo spójne: pEntity Framework Circular referencyjny

Więc jestem bardzo zdezorientowany i przy użyciu Entity Framework kod najpierw

Mam klasy lesie.

Mam klasę drzewa.

każdym lesie mogą mieć wiele drzew

Kiedy starałem się szeregować byłem coraz odwołanie cykliczne

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

Każdy las ma drzew, ale nie każde drzewo jest w lesie. Walczę albo z błędami wielości robiąc

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

gdzie model jest las

i jeśli robię ForestId się Guid zamiast Guid? uzyskać okrągłe błędy odniesienia.

Próbowałem też protected override void

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

góry dzięki

+0

Czy używasz DataContractSerializer? Jeśli tak, nie widzę twoich danych Kontrakty, ale musisz ustawić IsReference = true. –

Odpowiedz

16

najlepszym rozwiązaniem byłoby należy użyć DTOs przenieść tylko te dane, które chcesz do klienta. DTO powinny mieć tylko proste właściwości, aby nie tworzyły kołowrotowego błędu odniesienia. W tej chwili Las ma List<Trees> Trees i każdy Tree ciągu Drzew ma Forest i że Forest znowu ma List<Trees>

Or

można ozdobić swoje atrybuty z ScriptIgnore o właściwościach, które nie chcą się JSON. Zakoduj do serializacji, a następnie nie zostanie odesłany do klienta.

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

Np

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:

Wraz z ScriptIgnore należy również usunąć virtual z Forest i Trees i że będzie działać. Testowałem to. Jednak nie radziłbym, ponieważ wirtualne słowo kluczowe jest tym, co ładuje Lazy. Dlatego, jak już powiedziałem, trzeba tworzyć DTO oparte na tych modelach i wysyłać je tylko do klienta.

+0

Nawet przy zignorowaniu skryptu dało mi to cykliczne odniesienie, więc spojrzałem na model. Pole ID dla Drzewa kontynuuje wiercenie, podobnie jak pole ID dla lasu. Używam identyfikatorów GUID wygenerowanych w bazie danych za pomocą funkcji NewId(), która może być przyczyną mojego problemu? Nawet ustawiam Trees = null w Forest i nadal daje on okólnik. – Jordan

+0

@Jordan: zobacz moją edycję. – TCM

+0

Dziękuję bardzo. Skończyło się na tym, że zdałem sobie sprawę zeszłej nocy, że mogłem odłączyć wirtualne. Zdaję sobie sprawę, że nie jest to idealne rozwiązanie, ale ja tylko prototypuję do tego projektu, więc w tym przypadku wszystko jest w porządku. W przyszłych pracach produkcyjnych będę rzeczywiście używać DTO! Dziękuję bardzo! – Jordan