2017-06-06 97 views
1

基於此問題中提供的解決方案:How to update foreign key in EF 6 - Code First,我可以使用id字段更新我的外鍵。如何更新EF 6中的外鍵 - 代碼優先 - 一對多關係

但是現在,我從數據庫中獲取實體時發生異常。使用此代碼:

// Retrieve data first 
using (var db = new TestDbContext()) 
{ 
    var p2 = db.Persons.First(); 
} 

我得到以下SqlException:「無效的列名'Country_Id1'。」

有沒有人有任何線索能夠檢索數據來更新外鍵? 以另一種方式提問,是否可以使用導航屬性來簡化我的實體的使用以及外鍵的ID,以便能夠更新我的依賴實體?

我的實體

public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual Country Country { get; set; } 
    public int Country_Id { get; set; } 
} 

public class Country 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

回答

2

這可能是因爲實體框架試圖創建Person實體基於導航屬性Country新的外鍵。

我想你應該註釋Country_Id財產與ForeignKey屬性如下。

public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    [ForeignKey("Country_Id")] 
    public virtual Country Country { get; set; } 
    public int Country_Id { get; set; } 
} 

但是,如果按照下面的命名屬性的命名約定,則不需要對其進行註釋。

具有相同的數據類型作爲主主鍵 屬性,並與如下的以下格式之一 表示的關係的外鍵的名稱的任何屬性:「」,「」,或「」

你可以閱讀更多從here

public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual Country Country { get; set; } 
    public int CountryId { get; set; } 
} 

注意:您可能需要運行數據庫遷移或需要重新創建數據庫。

+0

確實。有點奇怪,如果你沒有明確的FK屬性,按照慣例默認的(shadow)屬性名稱是'Country_Id',但是對於顯式的FK,它是'CountryId',正如你所提到的:) –

+0

@IvanStoev感謝您糾正我。 –

+2

要完成@IvanStoev奇怪的評論:當使用多對多關係時,默認的屬性名是Country_Id ... – nmariot