【问题标题】:How to INSERT only new relation and DELETE a Existing relation - many to many Entity Framework 4.0如何仅插入新关系并删除现有关系 - 多对多实体框架 4.0
【发布时间】:2012-04-11 19:44:02
【问题描述】:

我有 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”中删除任何问题的问题标签。

帮我解决这个问题。

【问题讨论】:

    标签: entity-framework many-to-many


    【解决方案1】:

    不要将问题添加到上下文中(使用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 实例来加载问题和标签。您遇到的异常表明您正在使用多个不同的上下文。

    【讨论】:

    • 谢谢!有效!!我为查询和标签使用了单独的上下文。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 2017-01-28
    相关资源
    最近更新 更多