2012-10-10 10 views
12

Provando a questa domanda ancora una volta perché il mio primo tentativo è stato a malapena coerente: pEntity Framework circolare Riferimento

, quindi sono super-confusa e con Entity Framework Codice Prima

ho una classe Forest.

Ho una classe Tree.

ogni foresta può avere molti alberi

Quando stavo cercando di serializzare mi è stato sempre riferimento circolare

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

Ogni foresta ha alberi, ma non ogni albero è in una foresta. Faccio fatica sia con errori di Multiplicity quando si fa

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

Se il modello è una foresta

e se faccio un ForestIdGuid invece di un Guid? ricevo errori riferimento circolare.

Ho anche provato protetta override void

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

Grazie in anticipo

+0

Si sta utilizzando DataContractSerializer? In tal caso, non vedo i tuoi DataContracts, ma dovresti impostare IsReference = true. –

risposta

16

miglior approccio sarebbe si dovrebbe usare DTOs per trasferire solo i dati che si desidera il cliente. Le DTO dovrebbero avere solo proprietà semplici, quindi non creerà un errore di riferimento circolare. Al momento la foresta è List<Trees> Trees e ogni Tree all'interno di alberi è Forest e che Forest ha ancora una volta List<Trees>

O

Potete decorare i tuoi attributi con ScriptIgnore per le proprietà che non si desidera la JSON. Codifica per serializzare e quindi non verrebbe restituito al client.

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

Esempio:

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:

Insieme con ScriptIgnore si dovrebbe anche rimuovere virtual da Forest e Trees e che avrebbe funzionato. L'ho provato Tuttavia, non consiglierei questo perché la parola chiave virtuale è ciò che fa il caricamento Lazy. Quindi, come ho detto, è necessario creare DTO basati su questi modelli e inviare solo DTO al cliente.

+0

Anche se Script lo ignora, mi ha dato un riferimento circolare, quindi ho guardato la modella. Il campo ID per l'albero continua a perforare come fa il campo ID per la foresta. Sto usando GUID generati nel database usando NewId() questo potrebbe causare il mio problema? Ho persino impostato Trees = null in Forest e sta ancora dando un riferimento circolare. – Jordan

+0

@Jordan: vedere la mia modifica. – TCM

+0

Grazie mille. Ho finito per rendermi conto che ieri sera ho potuto togliere il virtuale. Mi rendo conto che non è la soluzione ideale ma sto solo prototipando per questo progetto, quindi in questo caso va bene. Nel futuro lavoro di produzione userò davvero DTO! Grazie mille! – Jordan