1

我正在使用 linq to sql 并尝试插入新对象。这是我的代码示例:

public class Farm(){
    public List<FarmAnimals> FarmAnimals ();
    public string FarmName;
}

Public class FarmAnimal(){
    public string name;
}

public void Insert(FarmModel farm)
    {
        using (var context = new FarmDataClassesDataContext())
        {
            context.Farms.InsertOnSubmit(new Farm { FarmName = farm.FarmName });
            foreach (var animal in farm.FarmAnimals)
            {
                context.Responses.InsertOnSubmit(new FarmAnimal {name = animal.name, farmID = farm.Id });


            }
            context.SubmitChanges();
        }
    }

当它尝试插入农场动物时,我得到一个 FK 约束错误,引用农场 ID(等于 0)。由于尚未插入农场,因此它没有可供农场动物参考的 ID。如何提交农场以便正确设置农场动物 FK?

谢谢,

4

3 回答 3

1

问题是您正在考虑 SQL 方式,而不是 ORM 方式。

SQL方式分配一个外键:

 InsertOnSubmit(new FarmAnimal {name = animal.name, farmID = farm.Id });

ORM 方式分配实体。请注意以下代码示例中 ** ** 之间的部分。

 var myFarm = new Farm { FarmName = farm.FarmName };
 Con...InsertOnSubmit(myFarm)
 Con...InsertOnSubmit(new FarmAnimal {name = animal.name, **farm = myFarm**});

因为您分配了实体,所以将处理正确的插入,并将其作为一笔交易的奖励。

于 2013-04-23T19:26:21.627 回答
0

要扩展 Pleun 的答案:您需要分配实体而不是 ID。您尝试分配的属性映射到具有外键约束的列,因此它不适用于分配实体 - 为此,您需要一个映射到两个表之间关系的属性. 你如何做到这一点因你使用的工具而异。

出于解释的目的,我假设您有一个Farm表,其中一个主键列称为;ID另一个列称为Name; 和一个FarmAnimal表,其中一个名为 的外键列FarmFK指向该Farm表,另一列名为Name.

根据DataContext名称的一部分,我假设您使用的是 Visual Studio 中内置的 O/R Designer 工具,对吧?如果是这样,通过打开文件转到 O/R 设计器,选择和dbml之间的关联(表示为箭头)(如果还没有箭头,请从工具箱中选择关联工具并从FarmFarmAnimalFarmFarmAnimal),并查看关联的属性。您将看到名为“子属性”和“父属性”的属性。(父表是关系中具有主键的表。)展开这些以查看每个的“名称”子属性。这些是您在代码中用于访问关系两端的属性名称。通常,根据自动生成,它们的名称选择不当,因此请根据需要重命名它们。在这种情况下,我们将父属性的名称重命名Animals为“Farm”,子属性的名称重命名为“Farm”。然后,您可以在代码中执行以下操作:

public void Insert(FarmModel farmModel)
{
    using (var context = new FarmDataClassesDataContext())
    {
        var farm = new Farm 
            {
                Name = farmModel.FarmName
            };
        context.Farms.InsertOnSubmit(farm);

        foreach (var animalModel in farmModel.FarmAnimals)
        {
            var critter = new FarmAnimal
                {
                    Name = animalModel.name,
                    Farm = farm
                }
            context.Responses.InsertOnSubmit(critter);
        }

        context.SubmitChanges();
    }
}

这能满足您的需求吗?

于 2013-04-26T01:44:44.787 回答
0

您必须在插入 FarmAnimals 之前提交更改,并且您需要让列自动创建具有自动增量的键。还要确保 DBML 文件中表对象中的列在插入时自动更新。

public class Farm(){
    public List<FarmAnimals> FarmAnimals ();
    public string FarmName;
}

Public class FarmAnimal(){
    public string name;
}

public void Insert(FarmModel farm)
    {
        using (var context = new FarmDataClassesDataContext())
        {
            Farm newFarm = new Farm { FarmName = farm.FarmName }; <--- New

            context.Farms.InsertOnSubmit(newFarm); <---Edited

            context.SubmitChanges();  <--- New

            foreach (var animal in farm.FarmAnimals)
            {
                context.Responses.InsertOnSubmit(new FarmAnimal {name = animal.name, farmID = newFarm.Id }); <--- Edited


            }
            context.SubmitChanges();
        }
    }
于 2013-04-23T17:32:13.737 回答