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; }
。
您的问题是数据层中的连接字符串和web层中的联系字符串指向不同的数据库。
例如。数据层读取dev数据库指向测试数据库的webapp。
更新连接字符串以指向同一数据库。
或
请确保您的两个数据库都有相同的表和列。
在做了更多的研究之后,我似乎遇到了一个相当独特的问题。我尝试了这里和许多其他网站上列出的几个修复程序,但似乎没有什么能解决这个问题。
然而,我在原始帖子底部列出的解决方案似乎是有效的,而且效果很好,所以我相信这是解决我问题的一个相当充分的解决方案。
为了在某种程度上概述正在发生的事情,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; }
}
我也遇到了类似的问题。发生的情况是,在数据库中创建了外键,它开始映射两个模型,然后抛出异常。最好的方法是使用[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应用程序中使用过这些视图。
所以,当我收到错误时,我自然地检查了所有数据库表,但忘记了没有添加新字段的视图。
在我的案例中,我有几个数据库,具有相同的表结构,但其中一个表缺少一个字段,因此错误消息和问题源之间没有关系。
因此,该消息应该被视为";缺少字段";。