这是我见过的最烦人的问题。
我有一张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,所以当然它会无效。这是视觉工作室中的错误吗?
答案 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);
}
}
}