我有3个具有多对多关系的表
问题 - (QuestionId,Question)
标签 - (TagId,TagName)
QuestionTag - (QuestionId,TagId)
我有一个用户提问的方案,他们可以添加相关标签。
稍后如果他们需要为现有任务添加一些新标签(已经在数据库中),该怎么做? 我需要将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 :(得分:0)
不要将问题添加到上下文(使用context.AddToQuestiones(question)
),您只是更改关系,并且不想在数据库中创建新的权利:
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
实例加载问题和标记。您遇到的例外情况表明您正在使用多种不同的上下文。