2013-10-11 18 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); 
    } 
相关问题