EntityFramework.dll中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理

时间:2014-04-17 08:27:14

标签: c# asp.net asp.net-mvc-4

我正在尝试为部门名称制作下拉列表。我正在使用MVC5。我在堆栈溢出上看到了太多的解决方案,但我从未找到与MVC5相关的有价值的解决方案。

Database Name : AppraisalDBContext
Table Name :  Department
Column Name : deptID (Primarykey)
              deptName (department name)
              Description 

我收到此错误:

An exception of type 'System.InvalidOperationException' occurred in  EntityFramework.dll but was not handled in user code

Additional information: The model backing the 'AppraisalDBContext' context has changed since the database was created.Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?

代码:

控制器类名称(DepartmentController.cs):

public ActionResult Index(string depName)
{
    var DeptLst = new List<string>();          
    var GenreQry = from d in db.Department
                   orderby d.deptName
                   select d.deptName;

    DeptLst.AddRange(GenreQry);                // Here I am confusing
    ViewBag.depName = new SelectList(DeptLst); // Here I am confusing
    var depts = from m in db.Department        // Here I am confusing
                select m;


    return View(depts);
}

模型类名称(Departments.cs):

namespace appraisalProject.Models
{
    [Table("Department")]
    public class Departments
    {
        [Key]
        public int deptId { get; set; }
        public string deptName { get; set; }
        public string Description { get; set; }
     }
}

模型类名称(AppraisalDBContext.cs):

namespace appraisalProject.Models
{
    public class AppraisalDBContext:DbContext
    {
        public DbSet<Departments> Department { get; set; }
    }
}

Index.cshtml:

@using (Html.BeginForm())
{
<p>
    Genre: @Html.DropDownList("depts", "All")
    <input type="submit" value="Filter" />
</p>
}

2 个答案:

答案 0 :(得分:6)

错误消息详细说明了您需要知道的所有内容:

  

附加信息:支持“评估文化”的模型&#39;自创建数据库以来,上下文已发生更改。考虑使用Code First Migrations更新数据库(http://go.microsoft.com/fwlink/

这意味着AppraisalDBContext中使用的某个类已更改,但数据库尚未更新,因此现已过期。您需要使用Code First迁移来更新它。

这是一个很好的blogpost引导您完成整个过程。

答案 1 :(得分:2)

兰的回答帮助了我。问题是,我更新了模型类,但数据库仍然是旧的定义。我认为初始化程序ClearDatabaseSchemaIfModelChanges&lt;&gt;应该在新的调用上重置数据库,这就是我在msdn上读到的内容。事实证明,初始化程序不会被调用。所以我手动删除了数据库:

new MyDbContext().Database.Delete();

在WebApiConfig的寄存器()Methode。

之后,在下次启动时调用初始化程序,并更新db模式。