Как выполнить обновление с помощью ObjectContext - PullRequest
0 голосов
/ 07 января 2011

Я использую EF4 в своем веб-приложении ASP.NET MVC 2.Я пытаюсь сохранить данные в базе данных.Довольно просто добавить новых данных в базу данных.Я делаю это примерно так:

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

Однако, это имеет неприятный побочный эффект - всегда сохранять новый объект в моей базе данных.Мне нужна эта функциональность (конечно), но я также хочу возможность обновить существующий элемент в базе данных (или сохранить как новый, если элемент еще не существует в базе данных).

Я пыталсязаменив вторую строку выше чем-то вроде этого:

entities.People.ApplyCurrentValues(person);

, но я получаю это InvalidOperationException:

Объект с ключом, который совпадает с ключом предоставленного объекта, не можетбыть найденным в ObjectStateManager.Убедитесь, что значения ключей предоставленного объекта соответствуют значениям ключей объекта, к которому необходимо применить изменения.

В этом случае происходит ли я пытаюсь добавить нового человека или пытаюсьредактировать человека.Что я могу сделать, чтобы исправить эту проблему?

Обновление вопроса:

Я попробовал ответы, представленные ниже, но когда я пошел отлаживать оператор Single,Я обнаружил, что идентификатор человека, которого я сохранял, всегда был равен 0, даже если я получил его из базы данных.Итак, я хотел опубликовать, что я делаю, чтобы получить веб-приложение в первую очередь.Может быть, это немного поможет.

Когда я перехожу на страницу с информацией о персоне, адрес:

http://localhost/Person/Index/1

, где 1 - это идентификаторЧеловек в базе данных.Я получаю Person через метод репозитория, который содержит следующую строку (entity - переменная-член класса репозитория):

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);
}

Теперь, когда я смотрю на это, мне интересно, неправильно ли создавать экземпляр объекта локальной сущности каждый раз, когда я хочу получить новую персону.(Я собираюсь исследовать это сейчас.) В любом случае, когда я делаю, в конечном счете, сохраняю поверх предыдущего Person, я обнаруживаю, что значение PersonID всегда == 0.

Ответы [ 3 ]

4 голосов
/ 07 января 2011

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();
1 голос
/ 11 ноября 2011

Попробуйте это:

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();
}
0 голосов
/ 07 января 2011
var entity = context.Table.Single(predicate);
entity.Field = "stuff";
context.SaveChanges();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...