Вставка идентификатора при публикации записи в производственной базе данных
У меня есть приложение 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, все работает для публикации, но каждый раз требуется передать значение идентификатора, которое нарушает первоначальные функциональные возможности базы данных.
С меньшими усилиями, пожалуйста, предложите свои мысли или подход, который я могу попробовать.
Заранее спасибо.