0

多対多の関係を持つ一連のテーブル (ConditionTemplate と KeyWord) があります。コードでは、特定の ConditionTemplate レコードにキーワードを追加しようとしています。残念ながら、特定の条件にキーワードを追加しようとすると、条件に関連付けられていない新しいキーワードを追加しているかのようにエラーが発生します。

私のモデルの画像: ここに画像の説明を入力

私のコード:

グローバル変数の作成:

    EnterpriseEntities EE;
    ConditionTemplate myConditionTemplate;

グローバル変数をロード:

            EE = new EnterpriseEntities();
            EE.Database.Connection.ConnectionString = Myapp.EnterpriseEntityConnectionString;

            myConditionTemplate = EE.ConditionTemplates.Where(c => c.TemplateCode == "17D").FirstOrDefault();

上記のコードは、多くのキーワードを持つ単一の条件をロードします。

利用可能なキーワードはリストボックスにあり、ユーザーはボタンを押してキーワードを選択し、条件に移動します。これはそれを処理するコードです。

                foreach (KeyWord SelectedKeyWord in ListBoxAvailableKeyWords.SelectedItems)
                {



                    KeyWord NewKeyWord = new KeyWord
                    {
                        KeyWordID = SelectedKeyWord.KeyWordID,
                        ID = SelectedKeyWord.ID,
                        Word = SelectedKeyWord.Word

                    };

                    myConditionTemplate.KeyWords.Add(NewKeyWord);



                }

次に、ユーザーがボタンを押して変更を保存し、私が呼び出します

 EE.SaveChanges

次に、次のエラーが表示されます。

System.Data.UpdateException: エントリの更新中にエラーが発生しました。詳細については、内部例外を参照してください。---> System.Data.SqlClient.SqlException: UNIQUE KEY 制約 'IX_KeyWord' の違反。オブジェクト 'dbo.KeyWord' に重複するキーを挿入できません。重複キー値は (ADJUDICATION) です。ステートメントは終了されました。

キーワード オブジェクトを作成するときに word プロパティ (Word = SelectedKeyWord.Word ) を設定するコードを削除すると、このエラーが発生します。

System.Data.Entity.Validation.DbEntityValidationException: 1 つ以上のエンティティの検証に失敗しました。詳細については、「EntityValidationErrors」プロパティを参照してください。

これは、単語フィールドが必要であることを示しています。

4

1 に答える 1

1

KeyWord選択した がデータベースに既に存在することをEF に伝え、問題を回避するには、それらをコンテキストにアタッチする必要があります。

foreach (KeyWord SelectedKeyWord in ListBoxAvailableKeyWords.SelectedItems)
{
    KeyWord NewKeyWord = new KeyWord
    {
        // You actually only need to set the primary key property here
        ID = SelectedKeyWord.ID
    };

    EE.KeyWords.Attach(NewKeyWord);
    myConditionTemplate.KeyWords.Add(NewKeyWord);
}

編集

エンティティが既にコンテキストにアタッチされている場合KeyWord(たとえば、以前に同じコンテキストで読み込まれたため)、代わりに次を使用できます。

foreach (KeyWord SelectedKeyWord in ListBoxAvailableKeyWords.SelectedItems)
{
    KeyWord NewKeyWord = EE.KeyWords.Find(SelectedKeyWord.ID);
    myConditionTemplate.KeyWords.Add(NewKeyWord);
}
于 2013-07-29T22:08:18.853 に答える