2013-08-05 17 views
0

當我嘗試在Azure表存儲上更新或創建實體時,它有時會拋出一個錯誤,如「實體已存在」或「請求輸入超出範圍「,然後如果我嘗試創建或更新該表上的某個其他實體,它也繼續拋出相同的錯誤。輸入沒有問題,就好像我重新啓動iis服務器一樣,它再次開始工作。我不知道爲什麼會發生這種情況。如果遇到一個錯誤,Azure表存儲服務上下文將繼續拋出相同的錯誤

我嘗試了不同的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; 
    } 
} 
+0

您是否考慮遷移到新版本的.Net Azure SDK。其更新的訪問服務方式簡單直觀。這裏是你想要遷移的鏈接http://go.microsoft.com/fwlink/?linkid=254364&clcid=0x409 –

回答

2

看來,包含您的實體(audioRecordServiceContext)的背景是在類級別上聲明,如果/當它被清除出去,目前尚不清楚。

表存儲上下文遵循「工作單元」設計模式。它們旨在跟蹤實體。如果你已經向你的上下文添加了一個「壞」實體並試圖堅持下去,那麼顯然你會得到一個錯誤。但是,你需要注意的是,你的背景並沒有拋棄壞的實體。它仍然在跟蹤它,它仍然認爲你想保存它。因此,下次調用SaveChanges將嘗試再次保存它。

建議:在您的上下文周圍放置一個「using」語句,並僅在需要保存實體時將其聲明在函數中 - 不要讓它位於類級別上 - 除非您有特定的用例需要它。但是,如果你這樣做,那麼一定要抽出失敗的實體從上下文對象的

HTH(你可以手動通過檢查上下文對象的實體集合,可以做到)

+0

我已經編輯了我的代碼。我在類的構造函數中聲明瞭服務上下文。並且正在訪問該類的方法中的服務上下文。所以我想當我從我的控制器調用方法時,服務上下文不會被清除。一種方法是在發生錯誤時分離實體。那會工作?有沒有其他方法? – Bitsian

+0

我正在將實體保存在類中的多個方法中,因此我不希望在這些方法中的每個方法中創建單獨的服務上下文 – Bitsian

+0

對創建上下文對象實際上沒有性能影響。它不像一個資源用完的SQL連接。表上下文只是一個具有URL並跟蹤實體的對象。您需要做出選擇,如果您需要在函數調用之間共享上下文中的實體 - 您應該掌握所有權並清理不合格的實體。否則,每次都會實例化新的上下文,並且實體跟蹤將是函數特定的 – Igorek

0

您可以重新爲的TableServiceContext對象給定表格。

TableServiceContext tableServiceContext = tableClient.GetDataServiceContext(); 
0

升級到存儲庫2.0,它的要好得多,支持更在查詢方面,而且是相當快一點啓動。