开发者

LINQ to SQL SubmitChanges() Inserts two Database Rows and one Child Row

I have this going me crazy,

I'm attaching a List with 1 Customer and 1 Address child record row. Everything seems OK while debugging. 1 customer Row and 1 Address Row should inserted. But instead I get 2 Customer Records and 1 Address Row.

I don't know why. When Attaching and looping inside the List only 1 record seen.

Any points?

[EDITED]

Code Attached:

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,
              开发者_如何学Python                    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;
        }
    }
}

I have checked the Log in the output and I see indeed 2 Inserts in the table. I don't see nothing about the Address, but inserts correctly.

It could be the foreign key problem i don't get it.


I guess you've solved this for now but I ran into a similar issue and wanted to report back my understanding of this issue for future users.

The issue, I believe, is that you are using an existing list of Customer objects retrieved from the DB using a particular DataContext. You are then creating a new DataContext in your method and with this new DataContext, you are attaching an Address object.

This Address object (assuming has a foreign key relation with Customer) creates a new Customer object in the DB since the DataContext for which SubmitChanges is called, the originalCustomer is also treated as a new record.

In other words, to avoid these problems, you must re-use the existing DataContext using which the originalCustomer List was fetched so that inserting the child record of Address doesn't trigger an entry into the parent table.

Hope this helps.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜