2013-10-09 128 views
0

我繼承了一些數據庫表和Entity Framework,我有如下表:實體框架如何更新子表

Table Person 
Id (Primary Key) 
Sex 
CarId (Foreign Key) 

Table Car 
Id (Primary Key) 
Color 
ManufacturerId (Foreign Key) 

Table Manufacturer 
Id (Primary Key) 
Name 

我使用實體框架的工作將數據拉入波蘇斯(沒有問題)。現在,我想改變一個人的汽車並保存到數據庫。我有一段時間這樣做。 我:

Car car= new Car { Color = "gray", Manufacturer = manufacturer}; 
_dbContext.Cars.Add(car); 
_dbContext.SaveChanges(); 
person.Car = car; 
_dbContext.Entry(person).State = EntityState.Modified; 
_dbContext.SaveChanges(); 

沒有異常拋出,新的汽車出現在數據庫中,但人行不更改爲指向新車。有人能告訴我發生了什麼以及我應該如何更新?我是Entity Framework的新手。

順便說一句,我試過其他組合,如試圖

person.CarId = car.Id. 

這就導致了一個例外:

參照完整性約束衝突發生了:該屬性定義參考 值約束在關係中的主體和從屬對象之間不是一致的 。

我似乎無法找到一個簡單的例子來清除事情。

回答

1

_dbContext.Entry(person).State = EntityState.Modified; 這告訴實體框架整個記錄已被更新。

所以,你可以試試這個方法:

Car car= new Car { Color = "gray", Manufacturer = manufacturer}; 
_dbContext.Cars.Add(car); 
_dbContext.Person.Attach(person); 
person.Car = car; 
_dbContext.SaveChanges(); 

現在實體框架應該跟蹤的列被更改。

,或者您可以撥打:

_dbContext.DetectChanges(); 
_dbContext.SaveChanges(); 

它應該幫助了。

I think this is very good article about Change Tracking with POCO in EF

+0

非常感謝Peter。你最後兩行_dbContext.DetextChanges()和_dbContext.SaveChanges()爲我解決了它。我沒有意識到在代碼中有一行:_dbContext.Configuration.AutoDetectChangesEnabled = false,我想解釋爲什麼DetectChanges有幫助。標記爲答案。 – Dave

+0

您使用的是哪個版本的Entity Framework?我的dbContext沒有DetectChanges()方法。 –