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

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

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

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")] 直接在此行上方:public virtual phone_types phone_types { get; set; } 在我的 phone_manager 类中。

【问题讨论】:

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


    【解决方案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 类文件中

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2019-11-02
                • 2016-04-22
                • 2019-02-13
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-07-12
                相关资源
                最近更新 更多