Quel est le meilleur moyen de sauvegarder une relation un à plusieurs dans Linq2Sql?

StackOverflow https://stackoverflow.com/questions/432510

  •  10-07-2019
  •  | 
  •  

Question

J'essaie de trouver le meilleur moyen de sauvegarder une relation simple un à plusieurs dans Linq2Sql.

Supposons que nous ayons le modèle POCO suivant (code pseduo btw):

La personne a zéro à plusieurs véhicules.

class Person
{
    IList<Vehicle> Vehicle;
}

class Vehicle
{
    string Name;
    string Colour;
}

Maintenant, quand je sauve une personne, je passe cet objet poco au code du référentiel (qui se trouve être L2S). Je peux sauver l'objet de la personne bien. Je le fais habituellement.

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

Je ne sais pas où et comment gérer la liste des véhicules que cette personne pourrait avoir? des suggestions?

Était-ce utile?

La solution

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

Maintenant, vous pouvez choisir de construire la liste des véhicules à un autre niveau, avec les données provenant de l'interface.

Mais vous devez vous rappeler qu'il n'est pas suffisant d'ajouter le véhicule à la liste de l'objet Personne, vous devez également définir la propriété véhicules de la personne à la personne qui possède les véhicules.

Observation Je n'en suis pas sûr, mais lorsque vous le faites db.People.SingleOrDefault , vous pouvez peut-être charger la totalité de la table People en mémoire. Ce n'est pas quelque chose que vous voulez faire. Corrigé par Slace dans les commentaires.

Autres conseils

Tout ce que vous avez à faire est de vous assurer que les relations appropriées sont définies dans la base de données.

Si votre table Vehicle a un PersonId et qu'il existe une clé étrangère entre elles lorsque vous les ajoutez au DBML, Linq to SQL détecte une relation entre elles et crée une Table<T> représentation de la relation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top