2010-09-03 22 views
0

我有這個打算我瘋了,的LINQ to SQL的SubmitChanges()插入兩個數據庫行和一個子行

我附加了一個列表1個客戶和1個地址子記錄行。 調試時一切似乎都正常。應該插入1個客戶行和1個地址行。 但是,我得到2個客戶記錄和1個地址行。

我不知道爲什麼。當在List中連接和循環時,只會看到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; 
     } 
    } 
} 

我在輸出檢查日誌,我看到的確是2個插入表中。 我沒有看到任何關於地址,但插入正確。

這可能是我不明白的外鍵問題。

+0

附上代碼示例bro。 – hydrogen 2010-09-03 23:01:06

+0

請1分鐘。 – AlwaysBeCoding 2010-09-03 23:06:29

+0

什麼是原創客戶? – DEVMBM 2010-09-06 02:01:44

回答

0

我想你現在已經解決了這個問題,但是我遇到了類似的問題,並希望向未來的用戶報告我對此問題的理解。

我認爲,問題在於您正在使用從數據庫檢索到的使用特定DataContext的Customer對象的現有列表。然後,您將在您的方法中創建一個新的DataContext,並使用這個新的DataContext附加一個Address對象。

此Address對象(假設與客戶有外鍵關係)在調用SubmitChanges的DataContext自從創建DB中的新Customer對象時,originalCustomer也被視爲新記錄。

換句話說,爲了避免這些問題,您必須重新使用現有的DataContext,使用它獲取originalCustomer列表,以便插入Address子記錄不會觸發父表中的條目。

希望這會有所幫助。

相關問題