2013-10-11 33 views
0

我目前正在嘗試保存在不同場景中使用new和Dirty Entity對象填充的EntityCollection。如何使用LLBLGEN Pro中的adapter.SaveEntityCollection()方法保存已填充的EntityCollection <Entity>

我已經設置了交易失敗的情況下回滾,同時節省。

但是,它似乎總是失敗,並拋出一個錯誤...在這兩種情況下,節省了新的或現有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中並將它們一次全部保存,使用一個用於事件回滾的事務引發異常。

請幫助

回答

1

例外表明,內LanguagetranslationCollection的實體之一被標記爲「新」,但主鍵是在你的數據庫已被使用。

所以,你不必單獨保存,但它實際上可能有助於確定哪些是重複的實體。一旦你確定它,你可以進一步調查爲什麼它使用已經使用過的PK。

+0

Thankyou.that令人驚歎。在什麼情況下使用SaveEntityCollection()方法?不幸的是,它有很少的文檔。 –

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); 
    } 
相關問題