更新上的实体框架POCO SaveChanges()不起作用?

时间:2010-11-02 05:23:45

标签: entity-framework entity-framework-4 poco

我正在使用EF CTP 4,使用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;
        }

我不确定我在这里做错了什么。任何的想法?感谢。

1 个答案:

答案 0 :(得分:20)

问题在于,当您分配findContact = contact时,EntityState中的ObjectStateManager未发生变化(因此它仍设置为Unchanged)。因此,不会为实体生成Update SQL语句。您有几个选项可以进行更新:

选项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();