Как сохранить уже заполненную коллекцию EntityCollection<Entity> с помощью метода adapter.SaveEntityCollection() в LLBLGEN Pro

В настоящее время я пытаюсь сохранить коллекцию EntityCollection, которая заполнена как новыми, так и грязными объектами Entity в различных сценариях.

Я настроил транзакцию для отката в случае сбоя при сохранении.

Тем не менее, он всегда кажется неудачным и выдает ошибку... в обоих случаях, сохраняя новую или существующую коллекцию EntityCollection.

У меня также есть метод, который выбирает и добавляет отдельные сущности, например LanguagetranslationEntity, в коллекцию Entity, которая определяется как свойство в классе.

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 и сохранив их все сразу, используя транзакцию в целях отката в случае возникновения исключения.

Пожалуйста, помогите

2 ответа

Исключение предполагает, что один из объектов внутри LanguagetranslationCollection помечен как "новый", но первичный ключ уже используется в вашей БД.

Таким образом, вам не нужно сохранять их по отдельности, но на самом деле это может помочь определить, что является дублирующейся сущностью. После того, как вы его определили, вы можете продолжить расследование. Почему он использует уже использованный ПК.

Я наконец-то понял:-)

Внутри каждой транзакции всегда следует помнить, что у них не должно быть никаких методов для повторной инициализации 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);
    }
Другие вопросы по тегам