Добавление нового элемента в свойства навигации не создает добавочный int PK - PullRequest
0 голосов
/ 24 мая 2019

Вот ситуация:

У меня есть сервер, который создает машинные программы для деталей. Моя инфраструктура выглядит следующим образом:

  • 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 к контексту заранее? Должен ли я пойти на что-то еще? Мое решение жизнеспособно?

Спасибо

1 Ответ

0 голосов
/ 24 мая 2019

В первом случае объект не был добавлен в контекст.willyDemandes - это просто переменная, которая содержит null, если запись не найдена.Установка переменной в значение не изменяет ничего, кроме указателя , хранящегося в этой ячейке памяти.

Первый фрагмент кода эквивалентен:

        WillyMachines willyMachines = willyDemandes.WillyMachines
                                                   .Where(x => x.DocumentType == MachineName)
                                                   .FirstOrDefault();
        if (willyMachines == null)
        {
            var otherMachines = new WillyMachines{ 
               IdDemande = willyDemandes.Id, 
               DocumentType = MachineName 
               WillyMachines.Add(willyMachines);            
               DateDebut = DateTime.Now;
               DateFin = null;
               Performance = null;
               Statut = Statuts.EnTraitement.ToString()
           };
       }
       db.SaveChanges();

Новые объектыследует добавить в контекст с помощью db.WillyMachines.Add(willyMachines);:

...