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

Linq to sql LINQ to SQL SubmitChanges()插入两个数据库行和一个子行,linq-to-sql,c#-3.0,Linq To Sql,C# 3.0,这让我抓狂 我附上一个列表,其中有一个客户和一个地址子记录行。 调试时,一切似乎都正常。应插入1个客户行和1个地址行。 但我得到了2条客户记录和1条地址行 我不知道为什么。在列表中附加和循环时,只看到1条记录 有什么要点吗 [已编辑] 所附代码: public bool InsertUpdateCustomers(List<Customer> customerList, List<Customer> originalCustomers) { using (DbCo

这让我抓狂

我附上一个列表,其中有一个客户和一个地址子记录行。 调试时,一切似乎都正常。应插入1个客户行和1个地址行。 但我得到了2条客户记录和1条地址行

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

有什么要点吗

[已编辑]

所附代码:

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;
        }
    }
}
public bool InsertUpdateCustomers(列出客户列表,列出原始客户)
{
使用(DbContext db=newdbcontext(DbContext.ConnectionString))
{
db.Log=Console.Out;
List customerCloned=新列表();
customerList.ForEach(p=>customerCloned.Add(p.CloneObjectGraph());
customerCloned.ForEach(p=>p.地址=
customerList.Where(pe=>pe.Id==p.Id).Single().Address.CloneObjectGraph());
customerCloned.ForEach(p=>
{
如果(p.Id>0)
{
db.客户。附件(p,
原客户。单身(
x=>x.Id==p.Id));
数据库地址。附件(第页地址,
原客户。单身(
x=>p.AddressId==x.AddressId)。
地址);
}
});
customerCloned.ForEach(p=>
{
如果(p.Id==0)
db.Customer.InsertOnSubmit(p);
});
尝试
{
db.SubmitChanges(ConflictMode.ContinueOnConflict);
返回true;
}
捕获(例外情况除外)
{
返回false;
}
}
}
我检查了输出中的日志,在表中确实看到了2个插入。 我看不到地址,但插入正确


这可能是外键问题,我不明白。

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

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

这个地址对象(假设与客户有外键关系)在数据库中创建一个新的客户对象,因为为其调用SubmitChanges的DataContext,原始客户也被视为一个新记录

换句话说,为了避免这些问题,必须重新使用获取原始客户列表所使用的现有DataContext,以便插入地址的子记录不会触发父表中的条目


希望这能有所帮助。

什么是原始客户????