MVC 3 Master / Detail UpdateModel вставляет новые подробные записи вместо обновления существующих записей - PullRequest
3 голосов
/ 06 февраля 2011

Хорошо, я прочитал статью Фила Хаака о связывании со списком, и у меня это работает нормально при одном просмотре. Но что я застрял, когда делал это с основной записи.

У меня есть действительно простая форма для этого объекта

public class Master
{
    public int ID { get; set; }
    public string MasterTitle { get; set; }
    public virtual IList<Detail> Details { get; set; }
}

public class Detail
{
    public int ID { get; set; }
    public string DetailName { get; set; }
    public virtual Master Master { get; set; }
}

Коллекция форм возвращается с ожидаемыми префиксами:

    [0] ""  
    [1] "ID"    
    [2] "MasterTitle"   
    [3] "Details[0].ID" 
    [4] "Details[0]"    
    [5] "Details"   
    [6] "Details[0].DetailName" 
    [7] "Details[1].ID" 
    [8] "Details[1]"    
    [9] "Details[1].DetailName" string

И Controller.UpdateModel (master) связывает все свойства правильно. Но когда я вызываю dbContext.SaveChanges, он выдает следующий sql из sql profiler (код psuedo)

update detail1 set masterID = null
update detail2 set masterID = null
update master set masterName = 'newname'
insert detail1 ...
insert detail2 ...

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

    public ActionResult Edit(FormCollection collection)
    {
        try
        {
            using (var ctx = new PlayContext())
            {
                var id = int.Parse(collection["ID"]);
                Master master = ctx.Master.Find(id);

                UpdateModel(master, new [] {"MasterTitle"});
                for (int i = 0; i < master.details.Count; i++)
                {
                    UpdateModel(master.details[i], "Details[" + i + "]", new[] { "DetailName" });
                }

                ctx.SaveChanges();
                return View(master);
            }
        }
        catch (Exception e)
        {
            ModelState.AddModelError("", e);
        }
        return View();
    }

У меня такое ощущение, что UpdateModel каким-то образом удаляет и повторно добавляет дочерние элементы.

Кто-нибудь еще заставил это работать? Конечно, я мог бы добавить полотенце и разобрать имена проиндексированных полей, но я так близко!

1 Ответ

1 голос
/ 14 ноября 2011

Это должно работать - у меня не было проблем с подобным кодом в MVC2.

Я беспокоюсь об этой строке, хотя: [5] «Детали»

Что это отправляет обратно в деталях? Я ожидаю, что это может быть причиной проблемы. Не совсем уверен, как работает механизм связывания моделей в MVC 3, но я ожидаю, что эта строка заставит коллекцию Details установить NULL.

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

...