2011-01-07 64 views
0

我在我的ASP.NET MVC 2 Web應用程序中使用EF4。我正試圖將數據保存到數據庫。這是相當簡單的添加新數據到數據庫。我正在做這樣的事情:如何使用ObjectContext執行更新

PeopleEntities entities = ObjectContextFactory.GetPeopleEntities(); 
entities.People.AddObject(person); // The Person object created from user input. 
entities.SaveChanges(); 

然而,這總是保存新對象到我的數據庫中的不幸的副作用。我確實需要這個功能(當然),但我也想要更新數據庫中的現有項目(或者,如果項目尚不存在於數據庫中,則保存爲新的項目)。

我試圖與東西替換第二線以上這樣的:

entities.People.ApplyCurrentValues(person); 

但我接收到該出現InvalidOperationException:

與所提供的對象的 鍵匹配的鍵的對象在ObjectStateManager中找不到 。 驗證提供的對象的鍵值是否與應用更改必須爲 的對象的鍵值 匹配。

無論我嘗試添加新人,還是嘗試編輯某人,都會發生這種情況。我能做些什麼來糾正這個問題?

更新到問題:

我嘗試下面提供的答案,但是當我去調試Single聲明,我發現我是拯救人的ID總是0 - 我就算了從數據庫中檢索它。所以,我想發佈我在做什麼來首先檢索Web應用程序。也許這會有所幫助。

當我瀏覽到顯示一個人的信息的頁面,地址是:

http://localhost/Person/Index/1

其中1是在數據庫中的人的ID。我通過包含以下行庫法(實體是存儲庫類的成員變量)檢索聯繫人:

public Person GetPerson(int id) 
{ 
    return entities.People.FirstOrDefault(p => p.PersonID == id); 
} 

這種方法是從我的項目的控制器調用。這看起來是這樣的:

public ActionResult Index(int id) 
{ 
    var entities = ObjectContextFactory.GetScenarioDBEntities(); 
    Person person = new PersonRepository(entities).GetPerson(id); 
    return View("Index", person); 
} 

現在,我在看,我不知道它是錯的實例化一個地方實體對象我想要檢索一個新的人每次。 (現在要研究這一點。)在任何情況下,當我這樣做,最終去救人比上年的人,我覺得爲PERSONID值始終== 0,

+0

這是奇怪的 - 所以你說,如果你有一個數據庫中的人與ID = 10,那麼你試試並找回那個人,這個ID是0?這沒有任何意義。認爲你需要重新修改你的實體/上下文設計。您不應該爲每個操作方法創建新的上下文。你應該實例化一個HTTP請求,並通過控制器的ctor(最好用一個DI容器) – RPM1984 2011-01-08 00:07:38

+0

@ RPM1984 - 這就是爲什麼我很困惑。這就是我認爲我在做的事情。如果你閱讀下面的@尼爾芬維克的建議(他發送的鏈接),我就是這麼做的。 (我爲自己感到驕傲,我自己想到了這一點)。我認爲我的問題可能在於我在提交時如何發送信息。這是我一直有點模糊。目前我正在使用MVC2強類型部分頁面。看起來我基本上只需要一個Controller方法來接收POST數據,然後按照上面的方法寫出來。似乎並不那麼容易...... – JasCav 2011-01-08 00:37:55

回答

4

entities.SaveChanges();是所有你需要,只要你檢索該對象來自相同的確切上下文。否則,您需要致電entities.Attach(person);

這應該工作:

PeopleEntities entities = ObjectContextFactory.GetPeopleEntities(); 
var person = entities.People.Single(p => p.Id == id); // or some other way to get the person in question 
// make changes to person ... 
entities.SaveChanges(); 
0
var entity = context.Table.Single(predicate); 
entity.Field = "stuff"; 
context.SaveChanges(); 
1

試試這個:

public void UpdateEntity(Entity entity) { 
    var entityKeyObj = DataContext.Entity.Where(i => i.ID == entity.ID).First(); 
    entity.EntityKey = entityKeyObj.EntityKey; 
    DataContext.ApplyCurrentValues("Units",entity); 
    SaveChanges(); 
} 
相關問題