7

tengo dos clase como esta:guardar un objeto con una relación bidireccional en mongodb usando oficial C# conductor

public Class Company 
{ 
    public IList<Employee> Employees; 
} 

public Class Employee 
{ 
    public Company WorkPlace; 
} 

cuando quiero guardar un objeto de empresa de clase:

MongoDatabase Database = MongoServer.GetDatabase("db"); 

var workPlace = new Company(); 

var employee = new Employee { WorkPalce = workPlace}  
workPlace.Employees = new List<Employee>{ employee }; 

Database.GetCollection<Company>("company").Save(workPlace); 

StackOverflow Excepción será arrojado.

Respuesta

6

Esto se debe a que tiene un ciclo formado por las clases que hacen referencia entre sí, claramente el controlador no está equipado para manejar esto y no estoy convencido de que deba hacerlo.

Debe decidir cómo quiere que se modelen estos datos en la base de datos.
Si tiene dos colecciones, una de empresas y una de empleados, entonces, en un nivel de datos, debería incluir los id para las referencias.

Si solo tiene una sola colección de compañías, solo necesita cambiar la clase de empleado para hacer referencia a la empresa con una identificación en lugar de una referencia de objeto.

Esto solo tiene que suceder en la base de datos, puede extender su modelo en su código C# para agregar automáticamente la referencia del objeto o cargarlo, etc. (evitando seleccionar N + 1 como lo hace) dependiendo de lo que sea correcto para la situación.

+0

si cambio de la clase empleado para hacer referencia de nuevo a la compañía con un id en lugar de una referencia de objeto, de modo que cuando tengo una lista de Empleados e itero la lista y deseo usar la Empresa de cada Empleado, para cada uno se generará una consulta. esto será lento, ¿no? –

+1

@OmidRH: Sí, normalmente será comparativamente lento. Hay muchas estrategias para mitigar, pero depende de lo que exactamente quiere lograr. Por ejemplo, si necesita mostrar el nombre de la compañía para cada empleado, puede copiar el nombre de la compañía al empleado. Mostrar una lista de empleados y sus nombres de compañías es fácil, pero cuando cambie el nombre de la empresa, deberá actualizar a todos los empleados. Esto se llama desnormalización. En NoSql, las consultas que necesita para dar soporte dan forma a la estructura de datos, no a los datos que necesita almacenar. – mnemosyn

Cuestiones relacionadas