0

我目前正在尝试保存一个在不同场景中填充了新实体和脏实体对象的 EntityCollection。

我已经设置了一个事务以在保存时在失败事件中回滚。

但是,它似乎总是失败并引发错误......在这两种情况下,保存一个新的或现有的 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;
       }

但是,无论我尝试保存新实体还是旧实体,总是会引发异常,如下所示。

在执行操作查询期间捕获到异常:违反主键约束“PK_LanguageTranslations”。无法在对象“dbo.LanguageTranslations”中插入重复键。重复键值为 (translation_10374, 1)。

public void SaveLanguageTranslationCollection(DataAccessAdapter adapter)
    {
        using (DataAccessAdapter newadapter = adapter)
        {
            adapter.SaveEntityCollection(LanguagetranslationCollection);
        }
    }

我应该自己保存每个实体吗?还有,我应该如何使用 SaveEntityCollection()?

我打算使用它来保存许多 LanguageTranslationEntities,方法是将它们填充到 EntityCollection 中并一次保存它们,在抛出异常的事件中使用事务来回滚。

请帮助

4

2 回答 2

1

异常表明 LanguagetranslationCollection 中的一个实体被标记为“新”,但主键已在您的数据库中使用。

因此,您不必单独保存它们,但它实际上可以帮助识别什么是重复实体。一旦你确定了它,你就可以进一步调查它为什么使用一个已经使用过的 PK。

于 2013-10-12T06:11:41.840 回答
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;
                }
            }

        }

您必须将运行事务的同一适配器传递给保存的方法。IE

private void savetranslationprompt(LanguageTranslationEntity translationentity,
DataAccessAdapter adapter)
    {
            adapter.SaveEntity(translationentity);
    }
于 2013-10-14T12:32:01.090 回答