0

Azure テーブル ストレージでエンティティを更新または作成しようとすると、「エンティティは既に存在します」または「要求入力の 1 つが範囲外です」などのエラーがスローされることがあります。そのテーブルの他のエンティティも、同じエラーをスローし続けます。iisサーバーを再起動すると、再び動作し始めるので、入力に問題はありません。なぜそれが起こっているのか、私にはわかりません。

「ContinueOnError」を含むさまざまな SaveChangesOptions を試しましたが、テーブル サービス コンテキストは、1 つのエラーが発生した後も、それ以降のすべての更新/作成でエラーをスローし続けます。

以下は、テーブル ストレージ サービス コンテキストを作成する方法に関する私のコードです。

何が問題なのか教えてください。テーブル サービス コンテキストでエラーが 1 つでも発生すると、アプリの主要な機能が動作しなくなるため、これが大きな障害となっています。

public class AudioRecordRepository : Repository<PersistedAudioRecord>, IAudioRecordRepository
{
    private TableStorageServiceContext<PersistedAudioRecord> audioRecordServiceContext;
    private CloudStorageAccount cloudStorageAccount;

    public AudioRecordRepository(IServiceContext<PersistedAudioRecord> serviceContext)
        : base(serviceContext)
    {
        if (RoleEnvironment.IsAvailable)
            cloudStorageAccount = CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue("StorageConnectionString"));
        else
            cloudStorageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["StorageConnectionString"]);

        audioRecordServiceContext = new TableStorageServiceContext<PersistedAudioRecord>(TableNames.AudioRecord, cloudStorageAccount.TableEndpoint.ToString(), cloudStorageAccount.Credentials) { IgnoreResourceNotFoundException = true };

    }

    public bool CreateRecord(PersistedAudioRecord record)
    {
        this.audioRecordServiceContext.Create(record);
        this.audioRecordServiceContext.SaveChangesWithRetries(SaveChangesOptions.ContinueOnError);

        return true;
    }
}
4

3 に答える 3

2

エンティティ (audioRecordServiceContext) を含むコンテキストがクラス レベルで宣言されているように見えますが、それがいつクリアされるかは明確ではありません。

テーブル ストレージ コンテキストは、「作業単位」設計パターンに従います。それらはエンティティを追跡するように設計されています。「悪い」エンティティをコンテキストに追加して永続化しようとすると、明らかにエラーが発生します。ただし、注意する必要があるのは、コンテキストが悪いエンティティを破棄していないということです。それはまだ追跡中であり、あなたがそれを保存したいと考えています。そのため、次に SaveChanges を呼び出すと、再度保存が試みられます。

提案: コンテキストの周りに "using" ステートメントを配置し、エンティティを保存する必要がある場合にのみ関数内で宣言します。それを必要とする特定のユース ケースがない限り、クラス レベルに置かないでください。ただし、そうする場合は、失敗したエンティティをコンテキスト オブジェクトからヤンクしてください (コンテキスト オブジェクトの Entities コレクションを調べることで手動で行うことができます)。

HTH

于 2013-08-05T19:51:48.240 に答える
0

特定のテーブルの TableServiceContext オブジェクトを再作成できます。

TableServiceContext tableServiceContext = tableClient.GetDataServiceContext();
于 2013-08-06T08:24:52.187 に答える