Entity Framework POCO SaveChanges () при обновлении не работает? - PullRequest
12 голосов
/ 02 ноября 2010

Я работаю с 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 Ответ

20 голосов
/ 02 ноября 2010

Проблема в том, что когда вы присваиваете 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();
...