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

JD *_*vis 13 c# sql asp.net asp.net-mvc entity-framework

我正在尝试从我的一些模型中获取与我的主要员工模型具有外键关系的信息.如果我单独绘制每个模型,我可以正常访问它们而没有任何问题,但我必须访问多个不同的网页才能这样做.

我正在尝试将我的几个模型合并到一个单独的控制器中,并以这种方式使用它们.不幸的是,当我尝试访问这些模型时,我收到一个奇怪的错误:

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

搜索完代码后,显然唯一的位置phone_types_phone_type_id出现在我的迁移代码中.我总体上对C#和Asp.Net非常陌生,所以任何帮助都会受到赞赏.

这是我的模型的代码:

[Table("employee.employees")]
public partial class employees1
{
    public employees1()
    {
        employee_email_manager = new List<email_manager>();
        employee_employment_history = new HashSet<employment_history>();
        employee_job_manager = new HashSet<job_manager>();
        employee_phone_manager = new HashSet<phone_manager>();
        this.salaries = new HashSet<salary>();
    }

    [Key]
    public int employee_id { get; set; }
    [Display(Name="Employee ID")]
    public int? assigned_id { get; set; }

    [Display(Name="Web User ID")]
    public int? all_id { get; set; }

    [Required]
    [StringLength(50)]
    [Display(Name="First Name")]
    public string first_name { get; set; }

    [StringLength(50)]
    [Display(Name="Last Name")]
    public string last_name { get; set; }

    [Column(TypeName = "date")]
    [Display(Name="Birthday")]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
    public DateTime birth_day { get; set; }

    [Required]
    [StringLength(1)]
    [Display(Name="Gender")]
    public string gender { get; set; }

    [Required]
    [StringLength(128)]
    [Display(Name="Social")]
    public string social { get; set; }

    [Required]
    [StringLength(128)]
    [Display(Name="Address")]
    public string address_line_1 { get; set; }

    [StringLength(50)]
    [Display(Name="Suite/Apt#")]
    public string address_line_2 { get; set; }

    [Required]
    [StringLength(40)]
    [Display(Name="City")]
    public string city { get; set; }

    [Required]
    [StringLength(20)]
    [Display(Name="State")]
    public string state { get; set; }

    [Required]
    [StringLength(11)]
    [Display(Name="Zip")]
    public string zip { get; set; }

    [Column(TypeName = "date")]
    [Display(Name="Hire Date")]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
    public DateTime hire_date { get; set; }

    [Column(TypeName = "date")]
    [Display(Name="Separation Date")]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
    public DateTime? termination_date { get; set; }

    [StringLength(70)]
    [Display(Name="Emergency Contact Name")]
    public string emergency_contact_name { get; set; }

    [StringLength(15)]
    [Display(Name = "Emergency Contact Number")]
    public string emergency_contact_phone { get; set; }

    [Display(Name = "Notes")]
    public string notes { get; set; }

    public virtual ICollection<phone_manager> employee_phone_manager { get; set; }

    [Table("employee.phone_manager")]
    public partial class phone_manager
    {
        [Key]
        public int phone_id { get; set; }

        public int employee_id { get; set; }

        [Required]
        [StringLength(15)]
        public string phone_number { get; set; }

        [StringLength(5)]
        public string phone_extension { get; set; }

        public int phone_type { get; set; }

        [Column(TypeName = "date")]
        public DateTime date_added { get; set; }

        public bool deleted { get; set; }

        public virtual employees1 employees1 { get; set; }

        public virtual phone_types phone_types { get; set; }
    }

    [Table("employee.phone_types")]
    public partial class phone_types
    {
        public phone_types()
        {
            phone_manager = new HashSet<phone_manager>();
        }

        [Key]
        public int phone_type_id { get; set; }

        [Required]
        [StringLength(50)]
        public string phone_type_name { get; set; }

        public virtual ICollection<phone_manager> phone_manager { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

以及我认为的相关代码:

        @foreach (var item in Model.employee_phone_manager)
        {
            @Html.DisplayFor(modelItem => item.phone_number); 
            @: - 
            @Html.DisplayFor(modelItem => item.phone_type);
            <br />
        }
Run Code Online (Sandbox Code Playgroud)

编辑我可能已经发现了问题,但如果有其他选择,我肯定会收到更多的输入.我的解决方案是采取并添加以下内容:[ForeignKey("phone_type")]直接在这一行之上:public virtual phone_types phone_types { get; set; }在我的phone_manager课堂上.

Moj*_*oji 18

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

例如数据层读取dev数据库webapp指向测试数据库.

更新连接字符串以指向同一数据库

要么

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


JD *_*vis 7

在做了相当多的研究后,似乎我有一个相当独特的问题.我尝试了在这里和许多其他网站上列出的几个修复程序,但似乎几乎没有解决问题.

但是,我在原始帖子底部列出的解决方案似乎正在运行,并且保持良好状态,因此我认为这是解决我问题的一个相当充分的解决方案.

为了概述发生的情况,MVC EF试图在两个模型中找到fk/pk关系,但由于模型中的列名不同,因此无法正确映射它们.如果我试图email_manager通过使用该email_types表来获取所有电子邮件,那不是问题,而是向后移动,并email_typesemail_manager错误中获取信息.

由于两个表之间的列名不同,因此EF尝试创建一个列来保存关系,但由于没有这样的列,因此抛出了错误.要纠正这一点,所有必要的是告诉EF外键列实际上是什么,并且通过使用[ForeignKey("email_type")]容纳父模型的集合来完成.

例如,我的新品email_typesemail_manager型号如下:

    [Table("employee.email_manager")]
    public partial class email_manager
    {
        [Key]
        public int email_id { get; set; }

        public int employee_id { get; set; }

        [Required]
        [StringLength(255)]
        public string email { get; set; }

        public int email_type { get; set; }

        [Column(TypeName = "date")]
        public DateTime date_added { get; set; }

        public bool deleted { get; set; }
        [ForeignKey("email_type")]
        public virtual email_types email_types { get; set; }

        public virtual employees1 employees1 { get; set; }
    }

    [Table("employee.email_types")]
    public partial class email_types
    {
        public email_types()
        {
            email_manager = new HashSet<email_manager>();
        }

        [Key]
        public int email_type_id { get; set; }

        [Required]
        [StringLength(50)]
        public string email_type_name { get; set; }

        public virtual ICollection<email_manager> email_manager { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)


Pri*_*ora 5

我有类似的问题。发生的情况是,在数据库中创建外键,并开始映射两个模型,然后引发异常。最好的方法是避免使用创建外键,[NotMapped]因为您可以使用复杂的模型,也可以避免创建Foreign Key.