System.Data.SqlClient.SqlException:列名“phone_types_phone_type_id”无效

Posted

技术标签:

【中文标题】System.Data.SqlClient.SqlException:列名“phone_types_phone_type_id”无效【英文标题】:System.Data.SqlClient.SqlException: Invalid column name 'phone_types_phone_type_id' 【发布时间】:2014-06-14 12:19:38 【问题描述】:

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

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

搜索完我的代码后,显然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; 
    

以及我认为的相关代码:

        @foreach (var item in Model.employee_phone_manager)
        
            @html.DisplayFor(modelItem => item.phone_number); 
            @: - 
            @Html.DisplayFor(modelItem => item.phone_type);
            <br />
        

编辑我可能已经发现了问题,但如果有其他选择,我肯定会接受更多意见。我的解决方案是采用并添加以下内容:[ForeignKey("phone_type")] 直接在此行上方:public virtual phone_types phone_types get; set; 在我的 phone_manager 类中。

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

很高兴被提醒查看您的连接字符串。仔细检查一下。 我花了一天时间尝试一切,直到找到你的答案。那是我的问题!我希望我能先看到这个。【参考方案2】:

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

但是,我在原始帖子底部列出的解决方案似乎正在运行,并且运行良好,因此我相信它是解决我的问题的一个相当充分的解决方案。

为了稍微概述正在发生的事情,MVC EF 试图在两个模型之间找到 fk/pk 关系,但由于模型之间的列名称不同,它无法正确映射它们。如果我试图通过使用email_types 表从email_manager 获取所有电子邮件,这不是问题,但向后移动,并从email_manager 获取来自email_types 的信息会引发错误。

由于两个表之间的列名不同,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; 
    

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

您已使用[Table("employee.employees")] 指定数据库表。检查您的数据库表是否有一个名称为phone_types_phone_type_id 的列。它尝试查找该列的数据但它没有找到列然后抛出此消息。我的问题已解决检查我的数据库数据库表。

【讨论】:

【参考方案5】:

我正在使用 nop commerce,为了解决我的问题,我不得不在我的数据库映射中使用 ignore

Ignore(p => p.CategoryAttachmentType);

在我拥有的域中

/// <summary>
    /// Gets or sets the category attachment type
    /// </summary>
    public CategoryAttachmentType CategoryAttachmentType
    
        get
        
            return (CategoryAttachmentType)this.CategoryAttachmentTypeId;
        
        set
        
            this.CategoryAttachmentTypeId = (int)value;
        
    

【讨论】:

【参考方案6】:

我遇到了同样的异常。我的解决方案是转到模型类并验证它定义的属性定义/类型的异常。在这里更好地检查您定义“phone_types_phone_type_id”的模型类/类。

【讨论】:

【参考方案7】:

你是对的。 我有类似的问题。 像这样的

   [ForeignKey("StatesTbl")]
   public int? State  get; set; 
   public StatesTbl StateTbl  get; set; 

如您所见,我在最后一行保留了名称“StateTbl”而不是“StatesTbl” 并且应用程序一直在寻找 StateTblID。然后我不得不改为将名称更改为“StatesTbl”。然后它开始运作良好。 所以现在,我改变的行是:

   [ForeignKey("StatesTbl")] <== 'StatesTbl' is my original States table
   public int? State  get; set; 
   public StatesTbl StatesTbl  get; set; 

这些在 AppDbContext.cs 类文件中

【讨论】:

以上是关于System.Data.SqlClient.SqlException:列名“phone_types_phone_type_id”无效的主要内容,如果未能解决你的问题,请参考以下文章