Я столкнулся со странной проблемой в приложении.У меня есть следующий код, который обновляет родительскую сущность и добавляет новые дочерние сущности.
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));
}
Теперь, просматривая журналы из производственной среды, я вижу, что сообщение «Подпункты не добавляются для идентификатора» регистрируется много раз, а подпунктыуспешно добавлено во второй операции сохранения.
Интересно, знает ли кто-нибудь причину этого странного поведения только в конкретной среде.