2010-11-02 144 views
12

我正在使用EF CTP 4,使用POCO模型,添加一個新對象並調用SaveChanges(),但更新對象不起作用。這裏的代碼更新:更新中的實體框架POCO SaveChanges()不起作用?

public void UpdateContact(Contact contact) 
     { 
      var findContact = GetContact(contact.ContactID); 
      findContact = contact; 
      _context.SaveChanges(); 
     } 

public Contact GetContact(int contactId) 
     { 
      return GetAllContacts().SingleOrDefault(c => c.ContactID == contactId); 
     } 

public IQueryable<Contact> GetAllContacts() 
     { 
      return _context.Contacts; 
     } 

我不知道我在做什麼錯在這裏。任何想法?謝謝。

回答

20

的問題是,當你將findContact = contactEntityState沒有得到在ObjectStateManager改變(所以它仍然設置爲Unchanged)。因此,沒有爲該實體生成SQL語句Update。您有幾種選擇做更新:

選項1:填充findContact場逐場:

var findContact = GetContact(contact.ContactID); 
findContact.FirstName = contact.FirstName; 
findContact.LastName = contact.LastName; 
... 
_context.SaveChanges(); 

選項2:使用ApplyCurrentValues方法:

var findContact = GetContact(contact.ContactID); 
_context.ApplyCurrentValues("Contacts", contact); 
_context.SaveChanges(); 

選項3:附加更新的實體並更改ObjectStateManager中的狀態。 (注意:這不會爲了獲取現有聯繫人而往返數據庫)。

_context.AttachTo("Contacts", contact); 
var contactEntry = Context.ObjectStateManager.GetObjectStateEntry(contact); 
contactEntry.ChangeState(EntityState.Modified); 
_context.SaveChanges(); 
+0

Yakimych您好,有**選項1 **,我可以用AutoMapper到findContact和接觸之間進行映射,而不是映射每個屬性?謝謝。 – Saxman 2010-11-02 18:11:10

+0

@Saxman - 儘管'AutoMapper'通常用於在不同類型的對象之間進行映射,您可以嘗試在映射的兩側使用相同的類型。我自己並沒有使用它,但你可以放棄它。請在解決問題後發佈更新 - 這對未來的參考很有用。 – Yakimych 2010-11-02 18:26:39

+0

出於某種原因,我無法使用我的上下文調用方法** ApplyCurrentValues()**,所以選項2排除了。我沒有嘗試選項3. AutoMapper在這種情況下不起作用,我不得不手動設置findContact equals的屬性來聯繫。謝謝! – Saxman 2010-11-03 03:38:09