4

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

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

人有零到多个车辆。

class Person
{
    IList<Vehicle> Vehicle;
}

class Vehicle
{
    string Name;
    string Colour;
}

现在,当我保存一个人时,我将该 poco 对象传递给存储库代码(恰好是 L2S)。我可以很好地保存 person 对象。我通常这样做。

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

我不确定我应该在哪里以及如何处理该人可能拥有的车辆清单?有什么建议么?

4

2 回答 2

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 表加载到 memory 中。这不是你想做的事情。由 Slace 在评论中更正。

于 2009-01-11T07:46:22.297 回答
1

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

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

于 2009-01-11T07:48:30.610 回答