0

現在、さまざまなシナリオで新しいエンティティ オブジェクトとダーティ エンティティ オブジェクトの両方が取り込まれた EntityCollection を保存しようとしています。

保存中に失敗した場合にロールバックするトランザクションを設定しました。

ただし、常に失敗するようで、エラーがスローされます...どちらの場合も、新規または既存の EntityCollection を保存します。

個々のエンティティ、つまり LanguagetranslationEntity を選択して、クラスのプロパティとして定義されている Entitycollection に追加するメソッドもあります。

public EntityCollection<LanguageTranslationEntity> LanguagetranslationCollection { get; set; }

public void AddLanguageTranslationToCollection(LanguageTranslationEntity prompt,bool isnew)
       {
           //Add the prompt to the collection
           LanguagetranslationCollection.Add(prompt);
           Isnewcollection = isnew;
       }

ただし、以下に示すように、新しいエンティティまたは古いエンティティを保存しようとしているかどうかに関係なく、常に例外がスローされます。

アクション クエリの実行中に例外がキャッチされました: PRIMARY KEY 制約 'PK_LanguageTranslations' の違反。オブジェクト 'dbo.LanguageTranslations' に重複するキーを挿入できません。重複キーの値は (translation_10374, 1) です。

public void SaveLanguageTranslationCollection(DataAccessAdapter adapter)
    {
        using (DataAccessAdapter newadapter = adapter)
        {
            adapter.SaveEntityCollection(LanguagetranslationCollection);
        }
    }

各エンティティを個別に保存する必要がありますか?? また、SaveEntityCollection() をどのように使用すればよいですか?

例外がスローされたイベントでロールバックの目的でトランザクションを使用して、多数の LanguageTranslationEntities を EntityCollection に入力し、それらを一度に保存するために使用するつもりです。

親切に助けて

4

2 に答える 2

1

例外は、LanguagetranslationCollection 内のエンティティの 1 つが「新規」としてマークされているが、主キーが DB で既に使用されていることを示しています。

したがって、それらを個別に保存する必要はありませんが、実際には重複エンティティを特定するのに役立ちます。それを特定したら、なぜそれがすでに使用されている PK を使用しているのかをさらに調査できます。

于 2013-10-12T06:11:41.840 に答える
0

私はついにそれを理解しました:-)

すべてのトランザクション内で、DataaccessAdapter を再初期化するメソッドを持つべきではないことを常に覚えておく必要があります。

using(var adapter = new DataAccessAdapter())
{
 //Do saving here
 SaveLanguageTranslationCollection(adapter);
};

これが原因で OurOfSyncException がスローされます。これは、状態データがクリアされ、最初の dataAccessAdapter で作成されたトランザクション用に新しく初期化されるためです。

ここに例があります。

public void Save(PromptEntity prompt)
        {
            using (var adapter = new DataAccessAdapter())
            {
                //start transaction
                adapter.StartTransaction(IsolationLevel.ReadCommitted, "SavePrompt");
                try
                {
                        //saving occurs here.
                        adapter.SaveEntity(prompt);
                        SaveLanguageTranslationCollection(adapter);
                        adapter.Commit();
                }
                catch (Exception)
                {
                    adapter.Rollback();
                    throw;
                }
            }

        }

トランザクションを実行している同じアダプターをメソッドの保存に渡す必要があります。すなわち

private void savetranslationprompt(LanguageTranslationEntity translationentity,
DataAccessAdapter adapter)
    {
            adapter.SaveEntity(translationentity);
    }
于 2013-10-14T12:32:01.090 に答える