2013-04-13 170 views
2

這是一個相當基本的問題,但我很驚訝沒有在任何地方找到合適的答案。使用實體框架插入引用其他表中記錄的記錄

考慮下面的數據庫模式:

Person {PersionID, Name, CountryOfBirthID [references Country]} 
Country {CountryID, CountryName} 

應用程序啓動時讀取所有從數據庫中的國家,並讓他們在列表中。 每當我添加一個新人時,我都會從上面列出的列表中創建一個ID和數據的新Country對象。我期待EF插入一個新的Person,在ID表中引用一個記錄的ID,但是它會向Country表插入一條新記錄併爲其分配一個新的ID,這顯然不是我想要的。

什麼是插入一個新的記錄引用記錄在其他表中的傳統方式? 我認爲,每當我添加Persion(在相同的上下文中)並重新使用提取的記錄時,我可以通過ID獲取國家/地區記錄,但有沒有其他方法可以讓我只訪問Person表?

回答

2

簡單的答案是,你需要'Attach'Country第一(即,讓實體Framwork知道這是它已經在上下文/數據庫存在):

var person = new Person { ... }; 
var country = new Country { Id = ... } // or _countriesList[2] in your case; 
person.Country = country; 

context.Attach(country); 
context.SaveChanges(); 

此外,如果您在使用創建您的實體設計師在Visual Studio中,你的實體應包含一個名爲'EntityReference'屬性,你可以用它來達到同樣的效果:

var person = new Person {}; 
person.Country.EntityReference = new EntityKey("MyEntities.Countries", "CountryId", countryId); 

(替換「MyEntities.Countries」和「CountryId」同都是適宜Ë值)

然而,我認爲,最簡單的方法是在你的實體「暴露」的外鍵:

class Person 
{ 
    .... 
    Country CountryOfBirth { get; set; } 
    int CountryOfBirthID { get; set; } 
} 

//then: 

var person = new Person { ... }; 
person.CountryOfBirthId = 2; 

如果你正在尋找一個更通用的方法來處理這個問題,查找Identity Map模式。

相關問題