2012-04-11 61 views
0

我有3代表許多一對多relationaship如何只插入新的關係和刪除現有關係 - 多對多的實體框架4.0

問題 - (QuestionId,問題)

標籤 - (標籤識別,標籤名)

QuestionTag - (QuestionId,標籤識別)

我有一種情況,用戶提出問題,他們可以將其添加相關的標籤。

後來,如果他們需要爲現有的任務添加一些新的標記(這已經在數據庫中),那麼該怎麼做? 我只需要將questionId和TagId添加到「QuestionTag」表中,而無需添加新的問題或標記,因爲它們已添加到表中。怎麼做?

我在鏈接Insert/Update Many to Many Entity Framework . How do I do it? 處發現了一個類似的問題,它具有類似的情況,其中添加了新問題並映射了已經在數據庫中的標籤。

using (var context = new MyContext()) 
{ 
    var question= new Question { Question = "I have a question" };  
    Tag tag1 = context.Tags.FirstOrDefault(s => s.Name == "C#");  
    Tag tag2 = context.Tags.FirstOrDefault(s => s.Name == ".net");  
    question.Tags.Add(tag1);  
    question.Tags.Add(tag2);  
    context.AddToQuestiones(question);  
    context.SaveChanges(); 
} 

因此,爲了與我的情況下工作,我修改了上面的代碼爲

var question= context.Question.FirstOrDefault(q => q.QuestionId == 1); 

,但我得到了以下異常。

「這兩個對象之間的關係無法定義,因爲它們被連接到不同的ObjectContext對象上。」 「

此外,如何從「QuestionTag」的問題標籤中刪除任何問題,如果錯誤地添加了不匹配標籤名稱。

幫我解決這個問題。

回答

0

的問題不添加到上下文(與context.AddToQuestiones(question)),你只改變的關係,不希望在數據庫中創建一個新的entitiy:

using (var context = new MyContext()) 
{ 
    Question question = context.Question.FirstOrDefault(q => q.QuestionId == 1); 
    Tag tag1 = context.Tags.FirstOrDefault(s => s.Name == "C#"); 
    Tag tag2 = context.Tags.FirstOrDefault(s => s.Name == ".net"); 

    question.Tags.Add(tag1); 
    question.Tags.Add(tag2); 

    context.SaveChanges(); 
} 

如果你想刪除標籤負載的問題包括從數據庫中標記,然後從加載的集合中刪除標籤:

using (var context = new MyContext()) 
{ 
    Question question = context.Question.Include("Tags") 
     .FirstOrDefault(q => q.QuestionId == 1); 

    // Retrieve the tag from the already loaded collection, 
    // you don't need to query the DB again for the tag 
    Tag tagToRemove = question.Tags.FirstOrDefault(s => s.Name == "C#"); 
    if (tagToRemove != null) 
     question.Tags.Remove(tagToRemove); 

    context.SaveChanges(); 
} 

確保您使用的日與加載問題和標籤相同的context實例。您遇到的異常表明您正在處理多個不同的上下文。

+0

謝謝!有效!!我爲Ques和Tags使用了單獨的上下文。 – 2012-04-13 18:00:07