Вот ситуация:
У меня есть сервер, который создает машинные программы для деталей. Моя инфраструктура выглядит следующим образом:
- WillyDemandes: запрос на создание программ для детали
- WillyMachines (относится к WillyDemandes от FK): каждая машинная программа
создан для этой части.
- WillyResults (относится к WillyMachines от FK): все предупреждения,
результаты, выводы для машины.
Серверы вытягивают первый WillyDemandes для обработки:
static public WillyDemandes GetFirst()
{
WillyDemandes willyDemandes;
using (Info_IndusContext db = new Info_IndusContext())
{
willyDemandes = db.WillyDemandes
.Include(x => x.IdPartNavigation)
.Where(x => x.Statut == Statuts.EnTest.ToString() && x.Username == Environment.UserName)
.OrderBy(x => x.Priority)
.ThenBy(x => x.Id)
.FirstOrDefault();
if (willyDemandes != null)
{
willyDemandes.Statut = Statuts.EnTraitement.ToString();
willyDemandes.ServerName = Environment.MachineName;
willyDemandes.DateDebut = DateTime.Now;
db.SaveChanges();
}
}
return willyDemandes;
}
Затем сервер добавляет новый элемент к детали (новый WillyMachines для WillyDemandes)
static public WillyMachines Create(WillyDemandes willyDemandes, string MachineName)
{
using (Info_IndusContext db = new Info_IndusContext())
{
WillyMachines willyMachines = willyDemandes.WillyMachines.Where(x => x.DocumentType == MachineName).FirstOrDefault();
if (willyMachines == null)
{
willyMachines = new WillyMachines() { IdDemande = willyDemandes.Id, DocumentType = MachineName };
willyDemandes.WillyMachines.Add(willyMachines);
}
willyMachines.DateDebut = DateTime.Now;
willyMachines.DateFin = null;
willyMachines.Performance = null;
willyMachines.Statut = Statuts.EnTraitement.ToString();
db.SaveChanges();
return willyMachines;
}
}
Проблема в том, что всякий раз, когда я делаю предыдущий код, SaveChanges говорит, что контекст не изменился, и идентификатор willyMachines остается равным 0 вместо того, чтобы захватить инкрементный идентификатор, который ему должна дать БД. Поэтому я сделал следующий патч в качестве обходного пути (добавьте к context.WillyMachines вместо свойства навигации и обновите WillyDemandes)
static public WillyMachines Create(WillyDemandes willyDemandes, string MachineName)
{
using (Info_IndusContext db = new Info_IndusContext())
{
WillyMachines willyMachines = willyDemandes.WillyMachines.Where(x => x.DocumentType == MachineName).FirstOrDefault();
if (willyMachines == null)
{
willyMachines = new WillyMachines() { IdDemande = willyDemandes.Id, DocumentType = MachineName };
db.WillyMachines.Add(willyMachines);
}
willyMachines.DateDebut = DateTime.Now;
willyMachines.DateFin = null;
willyMachines.Performance = null;
willyMachines.Statut = Statuts.EnTraitement.ToString();
db.SaveChanges();
willyDemandes = WillyDemandesController.Refresh(willyDemandes);
return willyMachines;
}
}
static public WillyDemandes Refresh(WillyDemandes willyDemandes)
{
using (Info_IndusContext db = new Info_IndusContext())
{
return db.WillyDemandes
.Include(x => x.IdPartNavigation)
.Include(x => x.WillyMachines).ThenInclude(x => x.WillyResults)
.Where(x => x.Id == willyDemandes.Id)
.FirstOrDefault();
}
}
Почему мой контекст не видит изменений в WillyDemandes? Должен ли я присоединить WillyDemandes к контексту заранее? Должен ли я пойти на что-то еще? Мое решение жизнеспособно?
Спасибо