2012-09-18 34 views
1

我有一個小問題,我需要你的幫助。我正在使用實體框架進行數據庫處理,我想更新數據庫中的數據集。用另一個EntityObject更新一個EntityObject

我有一個EntityObject的所有更改,並希望能夠更新此對象與現有的對象。

我用下面的代碼來更新數據:

IQueryable<Competitors> getCompetitor = DatabaseObject.Competitors.Where(SelectOnly => SelectOnly.competitorID == competitorObject.competitorID); 
Competitors competitor = getCompetitor.First(); 
competitor = competitorObject; 
DatabaseObject.SaveChanges(); 

但這deosn't工作。我如何更新數據庫中的日期?

+0

競爭對手對象從哪裏來? – Freeman

+0

對象是來自方法的參數。 –

+1

您的對象competitorObject不在上下文中。您需要從competitorObject的屬性更新競爭對手的屬性。 – tschmit007

回答

2

假設,你competitorObjectCompetitors型(competitor = competitorObject),你必須把它連接到你的情況下,將其標記爲修改,然後保存更改:

DatabaseObject.Competitors.Attach(competitorObject); 
DatabaseObject.Entry(competitorObject).State = EntityState.Modified; 
DatabaseObject.SaveChanges(); 

沒有必要檢索源對象在你的情況下,但沒有附加,上下文對你的更新對象一無所知。

的一段代碼,它標誌着一個對象作爲修飾,可以是一個有點不同,如果你使用的不是DbContext API ObjectContext API:

DatabaseObject.ObjectStateManager.GetObjectStateEntry(competitorObject).SetModified(); 
+0

這不起作用,因爲System.Data.Objects.ObjectStateEntry.State 是ReadOnly。 –

+0

@ DennisHeldt:對不起,更新了答案。兩年前我曾使用過ObjectContext API。 – Dennis

+0

Thangs。這樣可行。 –

0

你需要做出的唯一改變你的代碼讓它起作用,至少更新抓取的實體上的一個屬性。要更新的參考,不那麼像這樣的屬性值:

IQueryable<Competitors> getCompetitor = DatabaseObject.Competitors.Where(SelectOnly =>  SelectOnly.competitorID == competitorObject.competitorID); 
Competitors competitor = getCompetitor.First(); 
competitor.Name = competitorObject.Name; 
competitor.Contact = competitorObject.Contact; 
DatabaseObject.SaveChanges(); 

或者像丹尼斯說,你可以附加CompetitorObject上下文並將其標記爲已修改。這樣做將覆蓋現有Competitors記錄的所有屬性,值爲CompetitorObject

+0

由於對數據庫的額外查詢,這是一種效率低下的方式。如果他構建了對象,他只需要附加它。 – Dennis