Pregunta

Estoy tratando de encontrar la mejor manera de guardar una relación simple de uno a muchos en Linq2Sql.

Supongamos que tenemos el siguiente modelo de POCO (código pseduo por cierto):

La persona tiene cero a muchos Vechicles.

class Person
{
    IList<Vehicle> Vehicle;
}

class Vehicle
{
    string Name;
    string Colour;
}

Ahora, cuando guardo una Persona, paso ese pequeño objeto al código del repositorio (que resulta ser L2S). Puedo guardar el objeto persona bien. Usualmente hago esto.

using (Db db = new Db())
{
    var newPerson = db.People.SingleOrDefault(p => p.Id == person.Id) ?? new SqlContext.Person();
    // Left to right stuff.
    newPerson.Name = person.Name;
    newPerson.Age = person.Age;

    if (newPerson.Id <= 0)
        db.People.InsertOnSubmit(newPerson);
    db.SubmitChanges();
}

¿No estoy seguro de dónde y cómo debo manejar la lista de vehículos que la persona podría tener? alguna sugerencia?

¿Fue útil?

Solución

using (Db db = new Db())
{
    var newPerson = db.People.SingleOrDefault(p => p.Id == person.Id) ?? new SqlContext.Person();
    // Left to right stuff.
    newPerson.Name = person.Name;
    newPerson.Age = person.Age;

    // add vehicles.
    Vehicle firstV = new Vehicle();
    firstV.Name = "some name";
    firstV.Person = newPerson; // need to do this to set the person Id on the vehicle.
    newPerson.Vehicle.Add(firstV);
    // now when you save the Person it should save the Vehicle list 
    // if you set Cascade save update on the list. (not sure how to do that in L2S

    if (newPerson.Id <= 0)
        db.People.InsertOnSubmit(newPerson);
    db.SubmitChanges();
}

Ahora puede elegir construir la lista de vehículos en otro nivel, con los datos que provienen de la interfaz.

Pero debe recordar que no es suficiente agregar el Vehículo a la lista en el objeto Persona, también debe establecer la propiedad Persona de los vehículos a la persona que tiene los vehículos.

Observación No estoy seguro de esto, pero cuando haces db.People.SingleOrDefault puedes estar cargando toda la tabla People en la memoria. Eso no es algo que quieras hacer. Corregido por Slace en los comentarios.

Otros consejos

Todo lo que necesita hacer es asegurarse de que existan las relaciones apropiadas establecidas dentro de la base de datos.

Si su tabla Vehicle tiene un PersonId y hay una clave foránea entre ellos cuando los agrega al DBML Linq to SQL detectará que existe una relación entre ellos y creará una representación Table<T> de la relación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top