代码之家  ›  专栏  ›  技术社区  ›  Graham Conzett

未在使用asp.net MVC的实体框架中调用存储过程

  •  1
  • Graham Conzett  · 技术社区  · 16 年前

    我正在尝试使用Entity Framework中的存储过程映射功能来执行insert update和delete函数。

    无论出于何种原因,程序都没有被调用。它们被正确地映射了,我所要做的就是调用 SaveChanges(); 在我的控制器中执行。

    this tutorial 作为参考,我将如何更改控制器的编辑部分,使其利用存储过程?

    //
    // 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();
        }
    }
    }
    

    保存更改(); 更新存储过程将更新,因此我刚刚删除了对的调用 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事件探查器来确保。

    这个 编程实体框架 引用书籍教程的话说:

    所以,我想我遗漏了一些很明显的东西。

    编辑,这是我现在使用的确切版本,名称不同:

    //
        // 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 回复  |  直到 16 年前
        1
  •  1
  •   tvanfosson    16 年前

    示例中的问题是,作为参数接收的联系人实体与数据上下文不关联。因此,当调用SaveChanges时,不需要更新任何内容。通常在更新时,我使用提供的id,从数据库中获取原始实体,并对其应用更改。执行此操作时,SaveChanges应调用实体上的存储过程及其更改。

    返回代码以检索原始实体并对其应用更改。

        2
  •  0
  •   Shiraz Bhaiji    16 年前

    更新存储过程可能没有执行,因为没有要持久化的更改。

    推荐文章