2012-04-11 62 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