在Linq2Sql中保存一对多关系的最佳方法是什么?

时间:2009-01-11 07:30:10

标签: linq-to-sql one-to-many

我正试图找出在Linq2Sql中保存简单的一对多关系的最佳方法。

让我们假设我们有以下POCO模型(pseduo代码顺便说一句):

人有零到多个Vechicles。

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 个答案:

答案 0 :(得分:4)

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

现在,您可以选择使用来自界面的数据构建另一级别的车辆列表。

但是你需要记住,将Vehicle添加到Person对象的列表是不够的,还需要将车辆Person属性设置为拥有车辆的人。

观察我不确定这一点,但当您执行 db.People.SingleOrDefault 时,您可能会在内存中加载整个People表。这不是你想要做的事。在评论中由Slace纠正。

答案 1 :(得分:1)

您需要做的就是确保在数据库中设置了适当的关系。

如果您的Vehicle表具有PersonId并且在将它们添加到DBML时它们之间存在外键,则Linq to SQL将检测到它们之间存在关系并创建关系的Table<T>表示。