Обновляемый вид через форму?

Можно ли обновлять данные через форму без привязки формы к исходной таблице?

Нам нужно, чтобы пользователи обновляли небольшое подмножество данных в основной таблице, с которой отображается представление SQL. Ниже приведен пример кода, используемого для обновления данных:

[HttpPost]
public ActionResult Address(AddressView model)
{
    if (ModelState.IsValid)
    {
        TestEntities.AddressView .AddObject(model);
        TestEntities.SaveChanges();

        return Redirect("/Customer?id=" + model.id);
    }

    return View(model);
}

К сожалению, поскольку представление не может содержать первичный ключ, я получаю следующую ошибку при попытке обновить данные:

Невозможно обновить EntitySet 'AddressView', так как он имеет DefiningQuery и в нем нет элемента для поддержки текущей операции.

Есть ли возможный обходной путь без использования типичного оператора обновления SQL, я бы хотел, если это возможно, придерживаться Entity Framework.


person iggyweb    schedule 11.03.2015    source источник
comment
Не похоже, что вы можете сделать это, по крайней мере, легко. Почему бы не обновить базовую таблицу данных?   -  person abatishchev    schedule 11.03.2015
comment
В представлении есть 3 таблицы, а в основной таблице более 200 столбцов, а в этой конкретной задаче требуется обновить только несколько полей.   -  person iggyweb    schedule 11.03.2015
comment
В качестве обходного пути вы можете создать хранимую процедуру для обновления этих полей. И вызовите его из EF.   -  person abatishchev    schedule 11.03.2015


Ответы (1)


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

public ActionResult Customer(int id)
{
    var viewModel = new Customer();

    using (var testEntities = new TestEntities(new EntityConnection(StrEntities)))
    {
        var model = testEntities.CustomerView.Single(m => m.id == id);

        viewModel.id = id;
        viewModel.address_1 = model.address_1;
        viewModel.address_2 = model.address_2;
        viewModel.post_code = model.post_code;
    }

    return View("Customer", viewModel);
}

[HttpPost]
public ActionResult Address(Address viewModel)
{
    if (ModelState.IsValid)
    {
        using (var testEntities = new TestEntities(new EntityConnection(StrEntities)))
        {
            var model = testEntities.AddressTable.Single(m => m.id == viewModel.id);

            model.address_1 = viewModel.address_1;
            model.address_2 = viewModel.address_2;
            model.post_code = viewModel.post_code;

            testEntities.SaveChanges();
        }

        return Redirect("/Customer?id=" + viewModel.id);
    }

    return View(viewModel);
}

Надеюсь, это окажется полезным для других :-)

person iggyweb    schedule 17.03.2015