Подтвердить что ты не робот

Entity Framework POCO SaveChanges() для обновления не работает?

Я работаю с 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;
        }

Я не уверен, что я делаю неправильно здесь. Есть идеи? Спасибо.

4b9b3361

Ответ 1

Проблема заключается в том, что при назначении 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();