Вставка идентификатора при публикации записи в производственной базе данных

У меня есть приложение ASP.NET MVC, основанное на базе данных, с EF 6.0 (при необходимости можно обновить), в котором все работает правильно.

Теперь я хочу предоставить функцию публикации, которая будет перемещать (все дочерние элементы) запись в другую базу данных с той же схемой (ВАЖНО с тем же первичным ключом). Так что я могу проверить, есть ли запись уже (Обновление) или нет (Вставить).

Пожалуйста, поделись своими мыслями.

Я попробовал несколько подходов, таких как использование обеих БД с одинаковой схемой, но с другой строкой подключения

public int Publish(int id)
{
        using (var questionRepository = new QuestionRepository())
        {
            using (var questionProdRepository = new QuestionRepository("ProdConn"))
            {
                var question = questionRepository.Get(x => x.Id == id);
                var listAnswers = questionProdRepository.GetList(x => x.Id == id).SelectMany(x => x.tblDemographicAnswers).ToList();

                foreach (var answer in question.tblDemographicAnswers.ToList())
                {
                    questionRepository.AnswerStateChange(answer, System.Data.Entity.EntityState.Detached);

                    if (listAnswers.Any(x => x.ID == answer.ID))
                        questionProdRepository.AnswerStateChange(answer, System.Data.Entity.EntityState.Modified);
                    else
                        questionProdRepository.AnswerStateChange(answer, System.Data.Entity.EntityState.Added);

                    listAnswers.RemoveAll(x => x.ID == answer.ID);
                }

                foreach (var answer in listAnswers)
                    questionProdRepository.AnswerStateChange(answer, System.Data.Entity.EntityState.Deleted);

                questionRepository.Entry(question, System.Data.Entity.EntityState.Detached);

                if (questionProdRepository.Any(x => x.Id == id))
                    questionProdRepository.Update(ConvertToTable(ConvertToViewModel(question)));
                else
                    questionProdRepository.Add(question);

                return questionProdRepository.PublishChanges(question);
            }
        }
}

Метод сохранения изменений публикации в репозитории выглядит так:

public int PublishChanges(T table)
{
    int result = 0;

    DbContext.Configuration.AutoDetectChangesEnabled = false;

    using (var transaction = DbContext.Database.BeginTransaction())
    {
        DbContext.Database.ExecuteSqlCommand(@"SET IDENTITY_INSERT [dbo].[" + table.GetType().BaseType.Name + "] ON");
        result = DbContext.SaveChanges();

        DbContext.Database.ExecuteSqlCommand(@"SET IDENTITY_INSERT [dbo].[" + table.GetType().BaseType.Name + "] OFF");
        transaction.Commit();
    }

    return result;
}

но EDMX не предоставляет значение идентификатора для вставки, и если я удаляю Identity из EMDX designer, все работает для публикации, но каждый раз требуется передать значение идентификатора, которое нарушает первоначальные функциональные возможности базы данных.

С меньшими усилиями, пожалуйста, предложите свои мысли или подход, который я могу попробовать.

Заранее спасибо.

0 ответов

Другие вопросы по тегам