Я использую 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.