System.Data.SqlClient.SqlException:无效的列名'Gender_id'

时间:2018-09-08 17:38:28

标签: c# asp.net asp.net-mvc entity-framework

我正在学习使用asp.net mvc和Entity Framework开发Web应用程序。我有一个包含3个表格的学生,性别和课程的数据库。我遇到了这个问题。

第23行出现错误。

  

无效的列名称“ Genders_Id”。   无效的列名“ Programs_Id”。

     

异常详细信息::System.Data.SqlClient.SqlException:无效的列名“ Genders_Id”。   无效的列名“ Programs_Id”。

Source Error:


Line 21:         {
Line 22:             StudentsContext stdContext = new StudentsContext();
Line 23:             Students students = stdContext.Students.Single(std => std.Id == id);
Line 24:             //ViewBag.Student = students;
Line 25:             return View(students);

我对Student.cs模型的代码:

namespace WebApplication4.Models
{
  public class Students
  {
     public string Name { get; set; }
     public int Id { get; set; }
     public int Gender { get; set; }
     public int Program { get; set; }
     public string Country { get; set; }
   }
}

我的Context.cs文件:

public class StudentsContext:DbContext
{
    public DbSet<Students> Students { get; set; }
    public DbSet<Programs> Programs { get; set; }
    public DbSet<Genders> Genders { get; set; }
}

Programs.cs:

public class Programs
{
    public int Id { get; set; }
    public string Program { get; set; }
    public List<Students> Students { get; set; }
}

Genders.cs:

public class Genders
{
    public int Id { get; set; }
    public string Gender { get; set; }
    public List<Students> Students { get; set; }
}

数据库表:

enter image description here

2 个答案:

答案 0 :(得分:4)

Genders_IdPrograms_Id是由Genders.StudentsPrograms.Students集合导航属性分别引入的一对多关系的FK列的默认EF6常规名称。

由于FK属性/列名称不是常规名称,因此您应使用[ForeinKey]数据注释来指定它们:

public class Programs
{
    // ...
    [ForeignKey("Program")]
    public List<Students> Students { get; set; }
}

public class Genders
{
    // ...
    [ForeignKey("Gender")]
    public List<Students> Students { get; set; }
}

或(我更喜欢)流利的API:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // ...

    modelBuilder.Entity<Genders>()
        .HasMany(e => e.Students)
        .WithRequired()
        .HasForeignKey(e => e.Gender);

    modelBuilder.Entity<Programs>()
        .HasMany(e => e.Students)
        .WithRequired()
        .HasForeignKey(e => e.Program);
}

答案 1 :(得分:0)

您的问题是您在数据层中的连接字符串和在Web层中的连接字符串指向不同的数据库。

例如数据层读取开发人员数据库webapp并指向测试数据库。

要么更新连接字符串以指向相同的数据库

确保两个数据库具有相同的表和列