2017-07-25 83 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字段後,電話的虛擬導航屬性留在了地址模型類中? –

相關問題