Domanda

Sto cercando di capire il modo migliore per salvare una semplice relazione uno-a-molti in Linq2Sql.

Supponiamo di avere il seguente modello POCO (codice pseduo btw):

La persona ha zero o molti Vechicle.

class Person
{
    IList<Vehicle> Vehicle;
}

class Vehicle
{
    string Name;
    string Colour;
}

Ora, quando salvo una persona, passo quell'oggetto poco al codice del repository (che sembra essere L2S). Posso salvare bene l'oggetto persona. Di solito lo faccio.

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

Non sono sicuro di dove e come dovrei gestire l'elenco dei veicoli che la persona potrebbe avere? qualche suggerimento?

È stato utile?

Soluzione

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

Ora puoi scegliere di costruire l'elenco dei veicoli a un altro livello, con i dati che provengono dall'interfaccia.

Ma devi ricordare che non è sufficiente aggiungere il Veicolo all'elenco sull'oggetto Persona, devi anche impostare la proprietà Persona veicoli sulla persona che ha i veicoli.

Osservazione non ne sono sicuro ma quando fai db.People.SingleOrDefault potresti caricare l'intera tabella People in memoria. Non è qualcosa che vuoi fare. Corretto da Slace nei commenti.

Altri suggerimenti

Tutto quello che devi fare è assicurarti che ci siano le relazioni appropriate impostate all'interno del database.

Se la tabella del veicolo ha un PersonId e c'è una chiave esterna tra di loro quando li aggiungi al DBML Linq to SQL rileverà che esiste una relazione tra loro e creerà una Table<T> rappresentazione della relazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top