Entity Framework - Новые дочерние объекты не добавляются в базу данных при сохранении родительского объекта (только в производственной среде) - PullRequest
0 голосов
/ 31 мая 2018

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

    Item item = db.Items.Find(Id);

    if (newSubItems.Count() > 0)
    {
        newSubItems.ForEach(x =>
        {
            var subItem = new SubItem();
            subItem.Name = x.Name;

            item.SubItems.Add(subItem);
        });
    }

    item.ModifiedAt = DateTime.Now;
    item.ModifiedBy = UserId;

    db.Entry(item).State = EntityState.Modified;

    using (var s = db.Database.BeginTransaction(isolationLevel: IsolationLevel.RepeatableRead))
    {
        await db.SaveChangesAsync();
        s.Commit();

        logger.info("Updated successfully.");
    }

Этот код отлично работает в моей локальной среде.Если я добавляю новые подпункты, они успешно добавляются в соответствующую таблицу.

Модели приведены ниже.

    public partial class Item
    {
        public Item()
        {
            this.SubItems = new HashSet<SubItem>();
        }

        public int Id { get; set; }
        public DateTime ModifiedAt { get; set; }
        public int ModifiedBy { get; set; }
        public virtual ICollection<SubItem> SubItems { get; set; }
    }

    public partial class SubItem
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int ItemId { get; set; }
        public Item Item { get; set; }
    }

Однако это не работает в моей производственной среде, как ожидалось.Родительская сущность обновляется, но новые дочерние сущности не добавляются, если нет дочерних сущностейЯ проверил журналы, и я вижу, что "Обновление успешно" зарегистрировано.Если для родительского объекта есть хотя бы 1 дочерняя сущность, новые дочерние сущности добавляются успешно.

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

    int subItemsCount = db.SubItems.Where(a => a.ItemId == item.Id).Count();

    if (subItemsCount == 0 && newSubItems.Count() > 0)
    {
        logger.info(string.Format("Sub-items are not added for Id - {0}. Adding those again.", item.Id));

        newSubItems.ForEach(x =>
        {
            var subItem = new SubItem();
            subItem.Name = x.Name;
            subItem.ItemId = item.Id;

            db.SubItems.Add(subItem);
        });

        await db.SaveChangesAsync();

        logger.info(string.Format("Sub-items re-added successfully for Id - {0}.", item.Id));
    }

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

Интересно, знает ли кто-нибудь причину этого странного поведения только в конкретной среде.

1 Ответ

0 голосов
/ 31 мая 2018

При первом подходе вы должны проверить, равен ли item.SubItems ноль, прежде чем делать item.SubItems.Add() для него.

Если он равен нулю, инициализировать, как item.SubItems = new ICollection<SubItem>();

Во втором подходе, в этом блоке кода вы не назначаете ItemId

 newSubItems.ForEach(x =>
        {
            var subItem = new SubItem();
            subItem.Name = x.Name;
            subItem.ItemId = item.Id;/* missing line*/
            db.SubItems.Add(subItem);
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...