2010-05-24 59 views
4

我有一個主鍵(int自動增量)的客戶表和一個地址表與客戶表的外鍵。我試圖在一個很好的事務中將兩行插入到數據庫中。使用Linq2Sql插入數據到多個表使用自動遞增的主鍵

using (DatabaseDataContext db = new DatabaseDataContext()) 
{ 
    Customer newCustomer = new Customer() 
    { 
     Email = customer.Email 
    }; 

    Address b = new Address() 
    { 
     CustomerID = newCustomer.CustomerID, 
     Address1 = billingAddress.Address1 
    }; 

    db.Customers.InsertOnSubmit(newCustomer); 
    db.Addresses.InsertOnSubmit(b); 
    db.SubmitChanges(); 
} 

當我運行此我希望客戶和地址表自動與數據庫中的正確的鑰匙,因爲上下文知道這是一個自動遞增的關鍵,並會做兩個插入用兩個表在右側鍵。

我可以得到這個工作的唯一方法是首先對Customer對象執行SubmitChanges(),然後創建地址並對其執行SubmitChanges()。這將創建兩個往返數據庫,我想看看我是否可以在一個事務中做到這一點。可能嗎?

感謝

回答

2

克勞斯基本上已經指定你需要做的是什麼 - 試試這個代碼:

using (DatabaseDataContext db = new DatabaseDataContext()) 
{ 
    Customer newCustomer = new Customer() 
    { 
     Email = customer.Email 
    }; 

    Address b = new Address() 
    { 
     Address1 = billingAddress.Address1 
    }; 

    newCustomer.Address = b; 

    db.Customers.InsertOnSubmit(newCustomer); 
    db.SubmitChanges(); 
} 

如果地址b你剛創建的客戶聯繫起來,然後插入顧客進db.Customers收集,呼叫db.SubmitChanges()應自動保存地址,保存客戶並修復任何IDENTITY列以使其工作。它確實適用於我的測試用例。

你不能使用地址'或客戶的ID - 尚未設置。但是,你完全可以將全部對象相互關聯,從而獲得兩者之間的「連接」。

對於這個工作,你需要確保的是,在DBML設計師,在Properties窗口兩個ID列,該Auto Generated ValueTrueAuto-Sync是STE到OnInsert(兩者都沒有默認值) 。

1

如果在數據庫中的外鍵關係的Customer對象應該有一個集合稱爲Addresses您可以Add你叫b到地址的實例。如果你這樣做,你不必明確地添加地址到db.Addresses它將被框架自動添加,並且正確的客戶ID將被插入。

相關問題