2017-07-25 78 views
1

我试图使用实体框架将记录保存到我们的SQL Server数据库的地址表中,但是在调用context.SaveChanges时,我得到一个异常说“更新条目时发生错误,请查看内部例外以了解详细信息。“检查内部异常时,会出现一条消息“无效的列名'Telephone_TelephoneID'。”不存在的列名称或属性不存在

地址表没有“TelephoneID”列。它可能一次只有一个,但我们确信我们删除了它的任何痕迹;在地址表的任何键,约束或索引中都没有提及这样的列。地址记录的实体类(我添加到上下文的实例)没有“TelephoneID”属性。电话表有一个“TelephoneID”列,但我没有以任何方式涉及它或其实体类。

这个错误可能来自哪里?在此先感谢...

编辑 - 调试时,看上下文对象,我们注意到,地址属性的计算结果为:

{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_TelephoneID”搜索没有找到),我该如何纠正它?

+2

edmx可能不会被刷新!请尝试刷新edmx –

+0

尝试更新您的edmx模型 –

+1

尝试运行SQL Profiler并执行插入语句以找出错误 – OnDoubt

回答

0

简而言之,当Address有一个TelephoneID列时,剩下的元素和更新模型的实体类解决了这个问题。

一个线索的东西被关 - 我不知道我怎么错过了这个 - 本来应该是电话实体类如何具有这种性质:

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<Address> Addresses { get; set; } 

,当然还有,这个假使将启用延迟加载,并使用具有电话记录的电话号码的地址记录的地址对象填充。我们现在有一个具有AddressID和TelephoneID并实现它们作为外键,生成的代码( “OES” 自动写入)的AddressShipInfo类:

[Table("Sales.AddressShipInfo")] 
public partial class AddressShipInfo 
{ 
    ... 
    public virtual Address Address { get; set; } 

    public virtual Telephone Telephone { get; set; } 
} 

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

因此,现在当然可以检索地址或电话,而懒惰(或急切或显式)加载具有引用它的AddressShipInfo记录。最重要的是,Telephone_TelephoneID不再是地址查询的一部分!

感谢所有回复的人,希望这有助于某人。

0

如果数据库中存在不在您的模型或模型映射中处理的外键关系,我相信EF会尝试确定(或组成)用于关系的列名称。我认为回答这个问题可以帮助您查看电话和地址表的模型定义。如果有不被你的模型或模式图捕获数据库中的外键关系,你需要考虑那些具有下列选项之一:

  1. 使用FluentApi指定一个外键在模型地图

    modelBuilder.Entity<YourTable>() 
        .HasForeignKey(c => c.YourForeignKeyId); 
    
  2. 使用ForeignKey的属性来指定的模型类的外键(与相应的虚拟导航属性)

    [ForeignKey("YourForienKeyColumn")] 
    public virtual YourTable YourTable { get; set; } 
    
+0

谢谢,但地址表不再有任何外键。请参阅我上面的编辑。 –

+0

如果您发布地址模型类以及模型地图中的任何流畅API代码,可能有助于诊断问题。我仍然怀疑某种未解决的外键关系(可能在表格中包含TelephoneId列时留下)。例如,在从数据库中删除TelephoneId字段后,电话的虚拟导航属性留在了地址模型类中? –

相关问题