Sql server 不存在的列或属性的列名无效
我试图使用Entity Framework将一条记录保存到SQL Server数据库的地址表中,但在调用context.SaveChanges时,我收到一条异常消息:“更新条目时出错。有关详细信息,请参阅内部异常。”检查内部异常后,出现一条消息,“无效的列名‘电话号码’。” Address表没有“TelephoneID”列。它可能一次有一个,但我们肯定删除了它的任何痕迹;Address表的任何键、约束或索引中都没有提到这样的列。Address记录的实体类(我添加到上下文中的实例)没有“TelephoneID”“财产。电话表确实有一个“电话ID”列,但我没有以任何方式涉及它或它的实体类 这个错误可能来自哪里?先谢谢你 编辑--调试和查看上下文对象时,我们注意到Addresses属性的计算结果如下:Sql server 不存在的列或属性的列名无效,sql-server,entity-framework,Sql Server,Entity Framework,我试图使用Entity Framework将一条记录保存到SQL Server数据库的地址表中,但在调用context.SaveChanges时,我收到一条异常消息:“更新条目时出错。有关详细信息,请参阅内部异常。”检查内部异常后,出现一条消息,“无效的列名‘电话号码’。” Address表没有“TelephoneID”列。它可能一次有一个,但我们肯定删除了它的任何痕迹;Address表的任何键、约束或索引中都没有提到这样的列。Address记录的实体类(我添加到上下文中的实例)没有“Telep
{SELECT
1 AS [C1],
[Extent1].[AddressID] AS [AddressID],
[Extent1].[AddressTypeID] AS [AddressTypeID],
[Extent1].[City] AS [City],
[Extent1].[CompanyID] AS [CompanyID],
[Extent1].[Country] AS [Country],
[Extent1].[County] AS [County],
[Extent1].[Extra] AS [Extra],
[Extent1].[State] AS [State],
[Extent1].[Street] AS [Street],
[Extent1].[Zip] AS [Zip],
[Extent1].[UpdateTimeStampUtc] AS [UpdateTimeStampUtc],
[Extent1].[UpdateUserGUID] AS [UpdateUserGUID],
[Extent1].[UpdateUserID] AS [UpdateUserID],
[Extent1].[Telephone_TelephoneID] AS [Telephone_TelephoneID]
FROM [Sales].[Address] AS [Extent1]}
我猜这是表中有这个列时留下的。由于我不知道该查询值是如何创建的,也不知道它存储在何处(解决方案范围内搜索“Telephone\u TelephoneID”未找到任何结果),我如何更正它?如果数据库中存在外键关系,而这些关系在您的模型或模型映射中未得到处理,我相信EF将尝试确定(或弥补)要用于关系的列名。我认为,查看电话和地址表的模型定义将有助于回答这个问题。如果数据库中存在模型或模型映射未捕获的外键关系,则需要使用以下选项之一对这些关系进行说明:
modelBuilder.Entity<YourTable>()
.HasForeignKey(c => c.YourForeignKeyId);
如果数据库中存在在模型或模型映射中未处理的外键关系,我相信EF将尝试确定(或组成)用于该关系的列名。我认为,查看电话和地址表的模型定义将有助于回答这个问题。如果数据库中存在模型或模型映射未捕获的外键关系,则需要使用以下选项之一对这些关系进行说明:
modelBuilder.Entity<YourTable>()
.HasForeignKey(c => c.YourForeignKeyId);
简言之,Address有一个电话ID列时留下了一些元素,更新模型的实体类解决了这个问题 有一个线索是错误的——我不知道我怎么会错过这个——应该是电话实体类如何拥有这个属性:
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Address> Addresses { get; set; }
及
[表(“Sales.Address”)]
公共部分类地址
{
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2214:DoNotCallOverridableMethodsInConstructors”)]
公共广播
{
AddressShipInfoes=新哈希集();
}
...
公共虚拟地址类型地址类型{get;set;}
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2227:CollectionPropertiesShouldBreadOnly”)]
公共虚拟ICollection AddressShipInfoes{get;set;}
}
及
[表(“销售电话”)]
公共半类电话
{
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2214:DoNotCallOverridableMethodsInConstructors”)]
公用电话
{
AddressShipInfoes=新哈希集();
}
...
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2227:CollectionPropertiesShouldBreadOnly”)]
公共虚拟ICollection AddressShipInfoes{get;set;}
}
因此,当然,现在可以检索地址或电话,并且通过延迟(或急切或显式)加载,可以获得引用它的AddressShipInfo记录。最重要的是,电话号码不再是地址查询的一部分
感谢所有响应者,希望这能帮助到某人。简言之,当Address有一个电话ID列时,还剩下了一些元素,更新模型的实体类解决了这个问题 有一个线索是错误的——我不知道我怎么会错过这个——应该是电话实体类如何拥有这个属性:
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Address> Addresses { get; set; }
及
[表(“Sales.Address”)]
公共部分类地址
{
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2214:DoNotCallOverridableMethodsInConstructors”)]
公共广播
{
AddressShipInfoes=新哈希集();
}
...
公共虚拟地址类型地址类型{get;set;}
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2227:CollectionPropertiesShouldBreadOnly”)]
公共虚拟ICollection AddressShipInfoes{get;set;}
}
及
[表(“销售电话”)]
公共半类电话
{
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2214:DoNotCallOverridableMethodsInConstructors”)]
公用电话
{
AddressShipInfoes=新哈希集();
}
...
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2227:CollectionPropertiesShouldBreadOnly”)]
公共虚拟ICollection AddressShipInfoes{get;set;}
}
因此,当然,现在可以检索地址或电话,并且通过延迟(或急切或显式)加载,可以获得引用它的AddressShipInfo记录。最重要的是,电话号码不再是地址查询的一部分
感谢所有回复者,希望这对其他人有所帮助。edmx可能无法刷新!请尝试刷新edmxtry以更新您的edmx模型尝试运行SQL Profiler并执行insert语句以查找错误删除导航属性,将其从模型中排除或正确映射。谢谢,但我没有edmx。这
[Table("Sales.Address")]
public partial class Address
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Address()
{
AddressShipInfoes = new HashSet<AddressShipInfo>();
}
...
public virtual AddressType AddressType { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<AddressShipInfo> AddressShipInfoes { get; set; }
}
[Table("Sales.Telephone")]
public partial class Telephone
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Telephone()
{
AddressShipInfoes = new HashSet<AddressShipInfo>();
}
...
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<AddressShipInfo> AddressShipInfoes { get; set; }
}