LINQ to SQL SubmitChanges()插入两个数据库行和一个子行

时间:2010-09-03 22:56:17

标签: linq-to-sql c#-3.0

我让这让我发疯,

我正在附加一个包含1个客户和1个地址子记录行的列表。 调试时一切似乎都没问题。应插入1个客户行和1个地址行。 但相反,我得到2个客户记录和1个地址行。

我不知道为什么。在List中仅附加和循环时只看到1条记录。

任何要点?

[EDITED]

附加代码:

public bool InsertUpdateCustomers(List<Customer> customerList, List<Customer> originalCustomers)
{
    using (DbContext db = new DbContext(DbContext.ConnectionString))
    {
        db.Log = Console.Out;
        List<Customer> customerCloned = new List<Customer>();
        customerList.ForEach(p => customerCloned.Add(p.CloneObjectGraph()));
        customerCloned.ForEach(p => p.Address =
            customerList.Where(pe => pe.Id == p.Id).Single().Address.CloneObjectGraph());

        customerCloned.ForEach(p =>
        {
            if (p.Id > 0)
            {
                db.Customer.Attach(p,
                                  originalCustomers.Single(
                                      x => x.Id == p.Id));
                db.Address.Attach(p.Address,
                                     originalCustomers.Single(
                                         x => p.AddressId== x.AddressId).
                                         Address);
            }
        });
        customerCloned.ForEach(p =>
        {
            if (p.Id == 0)
                db.Customer.InsertOnSubmit(p);
        });


        try
        {
            db.SubmitChanges(ConflictMode.ContinueOnConflict);
            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
    }
}

我已经检查了输出中的Log,我确实在表中看到了2个Inserts。 我没有看到地址,但插入正确。

这可能是我无法解决的外键问题。

1 个答案:

答案 0 :(得分:0)

我想你现在已经解决了这个问题,但我遇到了类似的问题,并希望向未来的用户报告我对这个问题的理解。

我认为,问题在于您使用的是使用特定DataContext从DB检索到的现有Customer对象列表。然后,在方法中创建一个新的DataContext,使用这个新的DataContext,您将附加一个Address对象。

此Address对象(假设与Customer具有外键关系)在DB中创建一个新的Customer对象,因为调用SubmitChanges的DataContext,originalCustomer也被视为新记录。

换句话说,为了避免这些问题,您必须重新使用用于获取原始客户列表的现有DataContext,以便插入Address的子记录不会触发到父表的输入。

希望这有帮助。