Какой лучший способ сохранить отношения один ко многим в Linq2Sql? - PullRequest
4 голосов
/ 11 января 2009

Я пытаюсь найти лучший способ сохранить простое отношение один ко многим в Linq2Sql.

Предположим, у нас есть следующая модель POCO (кстати, псевдо-код):

У человека есть ноль ко многим автомобилям.

class Person
{
    IList<Vehicle> Vehicle;
}

class Vehicle
{
    string Name;
    string Colour;
}

Теперь, когда я сохраняю Person, я передаю этот объект poco в код репозитория (который является L2S). Я могу спасти человека объект в порядке. Я обычно делаю это.

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

Я не уверен, где и как мне следует обращаться со списком транспортных средств, которые может иметь этот человек? какие-либо предложения?

Ответы [ 2 ]

4 голосов
/ 11 января 2009
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();
}

Теперь вы можете составить список автомобилей на другом уровне, используя данные, которые поступают из интерфейса.

Но вы должны помнить, что недостаточно добавить Автомобиль в список объекта Person, вам также нужно установить свойство Person транспортных средств для человека, у которого есть автомобили.

Наблюдение Я не уверен в этом, но когда вы делаете db.People.SingleOrDefault , вы можете загружать всю таблицу People в память. Это не то, что вы хотите сделать. Исправлено Slace в комментариях.

1 голос
/ 11 января 2009

Все, что вам нужно сделать, это убедиться, что в базе данных установлены соответствующие отношения.

Если у вашей таблицы Vehicle есть PersonId и между ними есть внешний ключ, когда вы добавляете их в DBML, Linq to SQL обнаружит, что между ними есть связь, и создаст Table<T> представление взаимосвязи.

...