2016-01-04 99 views
0

我正在使用實體框架代碼第一次遷移。 ProfileLanguages(A Profile可以有許多Languages)之間有n:n關係。我想知道如果我有語言ID(外鍵),我可以如何更新配置文件的語言列表。對於1:1的關係(即,如果配置文件只能有1種語言),我可以更新LanguageID,但對於n:n,我沒有要更新的LanguageID列表,因此這意味着我必須再次訪問數據庫來檢索語言並初始化配置文件對象的Language屬性。有什麼辦法可以解決這個問題嗎?更新n:n關係中的外鍵 - 實體框架代碼第一次遷移

+0

「我沒有一個LanguageID列表」,爲什麼不呢?什麼阻止你在'Profile'上有虛擬列表語言?然後,您可以清除該列表並添加語言和EF應該整理,如果你有上下文中的一切。 –

+0

雖然我在更新實體時沒有語言。我有一個語言ID列表(整數)。我可以去數據庫並獲取語言,並使用該列表初始化配置文件對象中的語言屬性,就像您提到的一樣,但對數據庫來說似乎是不必要的。 – Eitan

+0

您可以僅使用ID進行更新。 https://msdn.microsoft.com/library/ee794150(v=vs.100).aspx –

回答

1

既然你命名這個遷移,我會假設你想做某種種子?我將從這個答案開始,所以我們有一些代碼來討論:

protected override void Seed(ApplicationContext context) 
{ 
    var languageIds = new List<int> {1,2,3,4}; // FK to language. Are you assigning same list to all profiles? 

    var profiles = context.Profiles.Include(p => p.Languages).ToList(); 
    foreach (var profile in profiles) 
    { 
     // Since you mention updating, you may need to remove old languages 
     if (profiles.Languages.Any()) 
     { delete children... } 

     // add new languages. You could add a test so you only seed when no languages are present 
     foreach (var languageId in LanguageIds) 
     { 
      profile.Add(new Language {LanguageId = languageId}; 
     } 
    } 

    context.SaveChanges(); 
} 
+0

謝謝!我不知道你可以用一個語言ID和實體框架知道要更新的語言來設置語言。 – Eitan

相關問題