2012-10-10 35 views
12

Tratando esta pregunta de nuevo porque mi primer intento fue apenas coherente: pMarco de la entidad de referencia circular

así que estoy muy confundido y utilizando entidad Código Marco Primera

tengo una clase Bosque.

Tengo una clase Tree.

cada bosque puede tener muchos árboles

Cuando yo estaba tratando de serializar que estaba haciendo referencia circular

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

Cada bosque tiene árboles pero no todos los árboles se encuentra en un bosque. Me esfuerzo, ya sea con errores de Multiplicidad al hacer

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

Cuando el modelo es un bosque

y si hago un ForestIdGuid en lugar de un Guid? recibo errores referencia circular.

También probé protegida override void

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

Gracias de antemano

+0

¿Está utilizando DataContractSerializer? Si es así, no veo tus DataContracts, pero necesitarías establecer IsReference = true. –

Respuesta

16

mejor enfoque sería que puedes usar dtos para transferir sólo los datos que desea el cliente. Los DTO deben tener propiedades simples, por lo que no crearán un error de referencia circular. En el momento del Bosque tiene List<Trees> Trees y cada Tree dentro de los árboles tiene Forest y que Forest nuevo tiene List<Trees>

O

Se puede decorar sus atributos con ScriptIgnore para las propiedades que usted no desea que el JSON. Codifique para serializar y luego eso no sería enviado de vuelta al cliente.

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

Ej:

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

Editar:

Junto con ScriptIgnore deberá consultar también eliminar virtual de Forest y Trees y que iba a funcionar. Lo he probado Sin embargo, no aconsejaría que debido a que la palabra clave virtual es lo que hace la carga Lazy. Por lo tanto, como dije, necesita crear DTO basados ​​en estos Modelos y solo enviar DTO al cliente.

+0

Incluso con Script ignore me dio una referencia circular así que miré el modelo. El campo de Id. Del Árbol sigue avanzando, al igual que el campo ID para el Bosque. Estoy usando GUIDs generados en la base de datos usando NewId() ¿podría estar causando mi problema? Incluso puse Trees = null en Forest y sigue dando una referencia circular. – Jordan

+0

@Jordan: ver mi edición. – TCM

+0

Muchas gracias. Terminé dándome cuenta anoche de que podía quitarme la virtualidad. Me doy cuenta de que no es la solución ideal, pero solo estoy creando prototipos para este proyecto, así que en este caso está bien. ¡En futuros trabajos de producción usaré los DTO! ¡Muchas gracias! – Jordan

Cuestiones relacionadas