Qual è il modo migliore per salvare una relazione uno-a-molti in Linq2Sql?
-
10-07-2019 - |
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?
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.