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

本文关键字:phone types pho SqlClient Data SqlException 无效 System | 更新日期: 2023-09-27 18:00:31

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

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

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; }
    }
}

在我看来,相关的代码是:

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

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

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

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

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

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

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

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

然而,我在原始帖子底部列出的解决方案似乎是有效的,而且效果很好,所以我相信这是解决我问题的一个相当充分的解决方案。

为了在某种程度上概述正在发生的事情,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; }
    }

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

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

我正在使用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;
        }
    }

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

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

   [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类文件中

我遇到了一个问题,我得到了相同的错误,我通过删除我创建的审计跟踪并创建一个新的跟踪来解决它。当我早些时候从表中删除一些列时,我忘记了这样做。

我的问题是,我忘记在数据库中创建了几个SQL视图。我在我的ASP.NET C#MVC应用程序中使用过这些视图。

所以,当我收到错误时,我自然地检查了所有数据库表,但忘记了没有添加新字段的视图。

在我的案例中,我有几个数据库,具有相同的表结构,但其中一个表缺少一个字段,因此错误消息和问题源之间没有关系。

因此,该消息应该被视为";缺少字段";。