0

当我尝试在 azure 表存储上更新或创建实体时,有时会引发错误,例如“实体已存在”或“其中一个请求输入超出范围”,然后如果我尝试创建或更新一些该表上的其他实体也继续抛出相同的错误。输入没有问题,就像我重新启动iis服务器一样,它又开始工作了。我不知道为什么会这样。

我尝试了不同的 SaveChangesOptions,包括“ContinueOnError”,但表服务上下文在遇到一个错误后继续在所有进一步的更新/创建中抛出错误。

下面是我关于如何创建表存储服务上下文的代码。

请让我知道问题可能是什么,这对我来说是一个巨大的障碍,因为如果表服务上下文仅遇到一个错误,我的应用程序中的主要功能就会停止工作。

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 将尝试再次保存它。

建议:在您的上下文周围放置一个“使用”语句,并仅在您需要保存实体时在函数中声明它 - 不要让它位于类级别 - 除非您有需要它的特定用例。但是如果你这样做了,那么确保将失败的实体从上下文对象中拉出来(你可以通过检查上下文对象的实体集合来手动完成)

高温高压

于 2013-08-05T19:51:48.240 回答
0

您可以为给定的表重新创建 TableServiceContext 对象。

TableServiceContext tableServiceContext = tableClient.GetDataServiceContext();
于 2013-08-06T08:24:52.187 回答
0

升级到 Storage Library 2.0,它好多了,在查询方面支持更多,启动速度也快了很多。

于 2013-08-06T18:50:12.513 回答