Как обновить объект в контроллере с помощью EF? - PullRequest
4 голосов
/ 28 февраля 2011

Я искал в Google, но это кажется слишком очевидным, и никто не говорит об этом.

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

В Linq2Sql у вас есть что-то вроде:

public void SaveCar(Car car)
{
    if (carTable.GetOriginalEntityState(car) == null)
    {
        carTable.Attach(product);
        carTable.Context.Refresh(RefreshMode.KeepCurrentValues, car);
    }
    carTable.ContextSubmitChanges();
}

и в контроллере просто вызовите этот метод для метода POST Edit.

Как мне сделать что-то подобное в EF?Лучший способ.

Я вижу код, использующий TryUpdateModel (модель), но я не уверен, обновляет ли это то, что у меня есть в БД, или мне нужно сначала выбрать объект и обновить его с помощью FormCollection ...

Я в замешательстве, мне просто нужно взять автомобиль из формы и обновить автомобиль с тем же идентификатором из БД.Итак, что мне делать в контроллере и хранилище?

Спасибо.

РЕДАКТИРОВАТЬ: Если бы я не был ясен, я действительно не знаю, есличто я положил туда, что мне нужно преобразован в EF.Я просто хочу знать, как я обновляю экземпляр объекта, используя EF (EFCodeFirst - то, что я использую).Как получить экземпляр из формы и обновить его в БД.

Ответы [ 2 ]

2 голосов
/ 24 марта 2011

Месяц без ответа, время автоответа.

Ответ на мой вопрос:

В контроллере есть что-то вроде:

if (ModelState.IsValid)
    repo.SaveCar(car);

и в репо:

context.Entry(Car).State = EntityState.Modified;

Только так можно сохранять объекты.

2 голосов
/ 28 февраля 2011

Метод TryUpdateModel может использоваться для присвоения значений объекту, используя сопоставление между его именами свойств и значениями, указанными в веб-запросе.При этом, вы можете достичь того же поведения, выполнив что-то вроде этого:

[HttpPost]
public ActionResult Edit(int id, FormCollection form)
{
    Car entity = new Car { Id = id };

    // This will attach the car entity to the content in the unchanged state.
    this.EntityFrameworkObjectContext.Cars.Attach(car);

    TryUpdateModel(entity, form.ValueProvider.ToXYZ()); // Can't remember the exact method signature right now

    this.EntityFrameworkObjectContext.SaveChanges();
    ...
}

При присоединении сущности к контексту вы просто уведомляете контекст, что у вас есть сущность, которую он должензаботиться о.Как только объект присоединен, контекст будет отслеживать изменения, внесенные в него.

Но этот метод подходит только для скалярных свойств, поскольку свойства навигации не обновляются с помощью этого метода.Если у вас включены свойства внешнего ключа (например, продукт, назначенный категории, также имеет свойство CategoryId, которое связывает их), вы все равно сможете использовать этот метод (поскольку свойство навигации отображается с помощью скалярного свойства).

Редактировать: Другой способ - принять экземпляр Car в качестве параметра:

[HttpPost]
public ActionResult Edit(int id, Car car)
{
    Car entity = new Car { Id = id };

    // This will attach the car entity to the content in the unchanged state.
    this.EntityFrameworkObjectContext.Cars.Attach(entity);

    // It is important that the Car instance provided in the car parameter has the
    // the correct ID set. Since the ApplyCurrentValues will look for any Car in the
    // context that has the specified primary key of the entity supplied to the ApplyCurrentValues
    // method and apply it's values to those entity instance with the same ID (this
    // includes the previously attached entity).
    this.EntityFrameworkObjectContext.Cars.ApplyCurrentValues(car); 
    this.EntityFrameworkObjectContext.SaveChanges();
    ...
}

Вы также можете свернуть свой собственный ModelBinder, который на самом деле имеет ссылку на контекст Entity Framework и смотрит, является ли Car.Id был указан в форме / запросе.Если идентификатор присутствует, вы можете получить объект для обновления непосредственно из контекста.Этот метод требует некоторых усилий, так как вы должны убедиться, что вы сначала ищете ID, а затем применяете все указанные значения свойств.Если вам интересно, я могу дать вам пример для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...