Хранимые процедуры не вызываются в платформе Entity с использованием asp.net MVC - PullRequest
1 голос
/ 26 июня 2009

Я пытаюсь использовать функцию отображения хранимых процедур в Entity Framework для выполнения функций вставки обновления и удаления.

По какой-то причине процедуры не вызываются. Они правильно сопоставлены, и, возможно, все, что мне нужно сделать, это вызвать SaveChanges(); в моем контроллере, чтобы они выполнились.

Используя этот учебник в качестве ссылки, что бы я изменил в части контроллера Edit, чтобы он использовал хранимую процедуру?

Код учебника:

//
// GET: /Home/Edit/5

public ActionResult Edit(int id)
{
    var contactToEdit = (from c in _entities.ContactSet
                         where c.Id == id
                         select c).FirstOrDefault();

    return View(contactToEdit);
}

//
// POST: /Home/Edit/5

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Contact contactToEdit)
{
    if (!ModelState.IsValid)
        return View();

    try
    {
        var originalContact = (from c in _entities.ContactSet
                             where c.Id == contactToEdit.Id
                             select c).FirstOrDefault();
        _entities.ApplyPropertyChanges(originalContact.EntityKey.EntitySetName, contactToEdit);
        _entities.SaveChanges();
        return RedirectToAction("Index");
    }
    catch
    {
        return View();
    }
}
}

Я думал, что, просто позвонив SaveChanges();, обновится sproc, поэтому я просто удалил вызов на ApplyPropertyChanges();, вот так:

//
// POST: /Home/Edit/5

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Contact contactToEdit)
{
    if (!ModelState.IsValid)
        return View();

    try
    {
        _entities.SaveChanges();
        return RedirectToAction("Index");
    }
    catch
    {
        return View();
    }
}
}

Хотя хранимая процедура обновления не выполняется, у меня запущен sql profiler, чтобы убедиться.

Книжные учебники Programming Entity Framework цитируются так:

Теперь, когда хранимые процедуры сопоставлены, нет необходимости вызывать их непосредственно в коде. Каждый раз, когда вызывается SaveChanges, Entity Framework будет использовать ваши хранимые процедуры для любых необходимых вставок, обновлений и удалений.

Итак, я полагаю, что мне здесь не хватает чего-то достаточно очевидного.

Правка, вот точная версия, с которой я сейчас работаю, названия разные:

//
    // GET: /Candidate/Edit/5

    public ActionResult Edit(int id)
    {
        var candidateToEdit = (from c in Internship.CompleteCandidate
                                where c.UserID == id
                                select c).FirstOrDefault();
        //ViewData["EducationID"] = new SelectList(Internship.education.ToList(), "ID", "Category", candidateToEdit.EducationID);
        return View(candidateToEdit);
    }

    //
    // POST: /Candidate/Edit/5 

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Edit(CompleteCandidate candidateToEdit)
    {
        if (!ModelState.IsValid)
            return View();

        try
        {
            var originalCandidate = (from c in Internship.CompleteCandidate
                                     where c.UserID == candidateToEdit.UserID
                                     select c).FirstOrDefault();
            Internship.ApplyPropertyChanges(originalCandidate.EntityKey.EntitySetName, candidateToEdit);
            Internship.SaveChanges();
            return RedirectToAction("Index");
        }
        catch(Exception e)

        {
            Response.Write("Error: " + e);
            //return View();
            return null;
        }

    }

}
}

Он выглядит почти идентично коду учебника по структуре, но выдает исключение NullReference во время выполнения.

Ответы [ 2 ]

1 голос
/ 26 июня 2009

Проблема в вашем примере заключается в том, что объект «Контакт», полученный в качестве параметра, не связан с контекстом данных. Таким образом, когда вызывается SaveChanges, обновлять нечего. Обычно при обновлении я использую предоставленный идентификатор и получаю исходную сущность из базы данных и применяю к ней изменения. Когда вы сделаете это, SaveChanges должен вызвать вашу хранимую процедуру для объекта с ее изменениями.

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

0 голосов
/ 26 июня 2009

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

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