2011-04-25 35 views
0

我有一些C#代碼看起來像下面的示例時失敗:無聲經由LINQ更新行爲sql

foreach (car c in listOfCars) { 
    c.garage.last_opened_at = DateTime.Now; 
} 
db.SubmitChanges(); 

基本上,carsgarages是在一對一的關係(一個有點瑕疵例如,我知道),並且我正在更新每個車庫上次打開的時間。

但是,當我檢查數據庫時,last_opened_at字段沒有被更新(沒有錯誤消息正在顯示)。任何建議爲什麼?我環顧了SO和Google,我看到的解決方案都提到​​需要一個主鍵。但我仔細檢查了一下,我的​​表的確將其外鍵用作其主車鑰匙。

問題是主鍵也加倍作爲外鍵(即,我是否需要專用的主鍵列)?

+1

我很好奇:如果你這樣做,你會得到不同的結果:「foreach(listOfCars.Select(c => c.garage)中的車庫g)」 – 2011-04-25 23:58:35

+0

@Andrew,nope,同樣的事情發生。 – grautur 2011-04-26 21:14:34

回答

1

這裏有幾種可能性:last_opened_at被指定爲數據庫提供的現場,你不必在你的LINQ上市to SQL類並不太可能主鍵,您listOfCars並非來自同一個數據庫上下文。

如果您將該字段標記爲由數據庫生成,這是使用時間戳或字段與數據庫默認值的典型場景,那麼linq to sql將永遠不會嘗試寫入該屬性。

如果linq to sql類沒有主鍵,無論數據庫在做什麼,它都不會寫入表。只要是主鍵,主鍵也是外鍵就不應該成爲問題。我遇到過這種情況,並想到在這種情況下我記得一個錯誤,但我不是100%確定的。

如果您從一個數據上下文生成listOfCars,並嘗試將它們保存在另一個數據上下文中,則第二個數據上下文不知道這些實體是否存在。您可以通過確保您使用相同的數據上下文或將實體附加到新的上下文來解決此問題。

+0

如果我理解正確,我想我在兩個不同的數據上下文中生成並保存'listOfCars'。我將如何將這些實體附加到新的上下文中? – grautur 2011-04-26 21:21:14

+0

@grautur:'db'表上有'Attach'方法。所以像'db.Cars.Attach(listOfCars)'應該做的伎倆。或者,您可以使用相同的數據上下文(也許通過構造函數注入)來執行這兩個操作。 – 2011-04-26 23:34:56

+1

我無法使'db.Cars.Attach(listOfCars)'工作(我得到一個錯誤,說'listOfCars'已經在表中了),但是改變我的代碼以使用相同的數據上下文也沒用。謝謝! – grautur 2011-04-27 17:24:46

0

如果您將呼叫轉移到循環中的SubmitChanges會怎樣?

foreach (car c in listOfCars) { 
    c.garage.last_opened_at = DateTime.Now; 
    db.SubmitChanges(); 
} 
0

您錯過了實際更新模型的調用。我相信你的例子應該是這樣的:

foreach(car c in listOfCars) { 
    c.garage.last_opened_at = DateTime.Now; 
} 
db.AcceptAllChanges(); 
db.SubmitChanges(); 

此外,更新將永遠不會失敗。如果更新失敗,它將拋出一個UpdateException。你的情況發生了什麼事情是你的代碼將會更新,但在模型中看不到更新,因此不會更新任何內容。如果您遇到主鍵或外鍵受限的問題,您將會遇到異常。