2012-09-13 85 views
1

我有一個Person表,其中有一個可爲空的AddressId,它是外鍵的Address表。所以零..一個到很多。實體框架ObjectContext在SaveChanges之前刪除實體

使用EF和ObjectContext我可以調用person.Address來訪問某個人的Address對象。整齊!

看看這個相當簡單的代碼,然後我會告訴你我的問題:

var _db = new DataContext(); 
Person person = _db.getThatOneGuy(); 

//some changes are done to the person object 
person.FirstName = "Harry"; 

//If there's no address I want to make one 
if(person.Address == null) 
person.Address = new Address(); 

person.Address.StreetOne = "blah"; 
person.Address.StreetTwo = "blah"; 

//I decide I don't actually want this new address 
person.Address = null; 

_db.SaveChanges(); 

到的SaveChanges()的調用仍然會產生一個SQL UPDATE(名字=「哈利」),這是偉大的,但它還會生成一條sql INSERT語句,試圖添加新地址(blah,blah)。 (我知道,因爲我檢查了SQL分析器中生成的SQL)它的錯誤,因爲我有像StateId這樣的字段不可爲空,但我不希望它甚至嘗試添加該地址(我試圖阻止它通過使它null)請幫助我。

注意:我之前已經成功使用過集合(多對多關係),在這裏我可以執行person.Addresses.Add(addressObj)然後person.Addresses.Remove(addressObj)並且ObjectContext知道不要插入。 ...只是不知道如何處理這個0..1到很多地址的情況。

謝謝。

回答

0

問題是,將Address屬性設置爲null不會從上下文中刪除Address實例。它僅通知上下文,Person實例和Address實例之間沒有關係。您仍然必須從上下文中刪除Address實例。試試這個:

_db.Detach(person.Address); 
_db.SaveChanges(); 

或:

var address = person.Address; 
person.Address = null; 
_db.Detach(address); 
_db.SaveChanges(); 
+0

謝謝你這做的工作。我還必須在調用_db.Detach(address)之後設置:person.AddressId = null。這是因爲調用person.Address = new Address()將person.AddressId設置爲0(以前爲空)。我需要它爲空,因爲在數據庫中沒有Id = 0的地址,因此引發了外鍵錯誤。再次感謝。 –