数据库中的列名无故更改。 “无效的列名称错误”

时间:2013-09-29 17:23:15

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

这是我见过的最烦人的问题。

我有一张5个不同列的汽车表。还有一个Department表。 这是我的班级:

[Table("Cars")]
public class Cars
{
    [Key] public int ID { get; set; }
    public int Year { get; set; }
    public int Department_id { get; set; }
    public string Manufactor { get; set; }
    public string Name { get; set; }
}

[Table("Department")]
public class Department
{
    public int id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public List<Cars> CarList { get; set; }
}

public class CarsContext : DbContext
{
    public DbSet<Cars> CarSets { get; set; }
    public DbSet<Department> DepartmentSets { get; set; }
}

这是我的控制者:

    public class CarsController : Controller
    {
        //
        // GET: /Cars/

        public ActionResult index(int? id)
        {
            CarsContext _CarsContext = new CarsContext();
            List<Cars> C = _CarsContext.CarSets.Where(Car => Car.Department_id == id).ToList();

            return View(C);
        }
}

我的索引视图

@model IEnumerable<ASPDemo1.Models.Cars>

@using ASPDemo1.Models;

@{
    ViewBag.Title = "All Available Cars";
}
<div style="font-family:Arial">
<h2>All Available Cars</h2>
<ul>
    @foreach (var C in Model)
    {
        <li>
            @Html.ActionLink(C.Name + " - " + C.Year, "Details", new { id = C.ID })
        </li>
    }
</ul>
</div>

谁知道是什么原因,我从中得到一个内在的例外。当我从我的类中删除Department_id代码时,这非常有效。但是,如果我定义了一个Department_id,它会抛出一个内部异常,指出“无效的列名”Department_id1“”。我不知道为什么,但它在列名中加1,所以当然它会无效。这是视觉工作室中的错误吗?

5 个答案:

答案 0 :(得分:2)

我不得不删除公共List CarList {get;组;来自Department。我不知道为什么解决这个问题,但确实如此。

答案 1 :(得分:0)

你应该可以这样做:

[Column("ColumnNameInDB", TypeName="int")]
public int Id { get; set; }

答案 2 :(得分:0)

我不确定你是否愿意这样做, 但在实体框架中,当引用数据库中的表时,c#代码使表名复数化。 因此,尝试将您的表重命名为Departments ...(类似频率频率等等) 这种方式即使C#代码中的表名是department,它也会引用正确的表Departments及其列。 感谢

答案 3 :(得分:0)

@ JohnC1,你提到你删除了“List CarList”并且它有效,原因可能是由于引用了另一个DB表和列名。通过删除该行,您不再自动访问通过外键链接到Cars表的数据。

如果您首先使用数据库来构建数据库模型,则很可能您在数据库中拥有(或拥有)重复的外键或类似内容。添加另一个表(数据库优先)后,我收到了同样的错误,并且某处复制或损坏了外键。删除密钥并重建.EDMX DB模型对我有用。

答案 4 :(得分:0)

我也遇到了同样的错误,因为我错误地认为在DB和模型类之间有不匹配的数据类型。

public string DepartmentID { get; set; } != int DepartmentID of table.

It worked when I fixed it.

Below is my example:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Web;

namespace Part10MVC.Models
{
    [Table("tblDepartment")]

    public class Department
    {
        public int ID { get; set; }
        public string Name { get; set; }
       public List<Employee> Employees { get; set; }
    }
}


    using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Web;

namespace Part10MVC.Models
{
    [Table("tblEmployee")]
    public class Employee
    {
        public int employeeID { get; set; }
        public string Name { get; set; }
        public string Gender { get; set; }
        public string City { get; set; }
        public int DepartmentID { get; set; }
    }
}



using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;

namespace Part10MVC.Models
{

    public class EmployeeContext: DbContext
    {
      public  DbSet<Employee> Employees { get; set; }
        public DbSet<Department> Departments { get; set; }
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Part10MVC.Models;

namespace Part10MVC.Controllers
{
    public class DepartmentController : Controller
    {
        //
        // GET: /Department/

        public ActionResult showDepartment()
        {
            EmployeeContext ec = new EmployeeContext();
            List<Department> departments =ec.Departments.ToList();
            return View(departments);
        }

    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Part10MVC.Models;

namespace Part10MVC.Controllers
{
    public class EmployeeController : Controller
    {
        //
        // GET: /Employee/

        public ActionResult showEmployees(int id)
        {
            EmployeeContext ec = new EmployeeContext();
            List<Employee> liEmp = ec.Employees.Where(x=>x.DepartmentID==id).ToList();
            return View(liEmp);
        }

    }
}