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_types
和email_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”无效的主要内容,如果未能解决你的问题,请参考以下文章