0

多対多の関係を持つ3つのテーブルがあります

質問 - (QuestionId, Question)

タグ - (TagId、TagName)

QuestionTag - (QuestionId、TagId)

ユーザーが質問をして、それに関連するタグを追加できるというシナリオがあります。

後で、既存のクエストに新しいタグ (既にデータベースにある) を追加する必要がある場合は、どうすればよいですか? questionId と TagId のみを「QuestionTag」テーブルに追加する必要があります。これらは既にテーブルに追加されているため、新しい質問やタグを追加する必要はありません。どうやってするの?

リンクInsert/Update Many to Many Entity Framework で同様の質問を見つけました。どうすればいいのですか? 新しい質問が追加され、データベースに既に存在するタグがマップされる同様のシナリオがあります。

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);

しかし、私は次の例外を得ました。

「2 つのオブジェクトの関係は、異なる ObjectContext オブジェクトに関連付けられているため、定義できません。」

また、不一致のタグ名で誤って追加された場合、質問の「QuestionTag」から質問タグを削除する方法。

これを解決するために私を助けてください。

4

1 に答える 1

0

コンテキストに質問を追加しないでください (with 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質問とタグをロードするために同じインスタンスを使用していることを確認してください。発生している例外は、複数の異なるコンテキストで作業していることを示しています。

于 2012-04-11T23:33:38.670 に答える