代码之家  ›  专栏  ›  技术社区  ›  Jiveman

如何在添加/删除子实体时自动更新父实体上的“LastModifiedDate”时间戳

  •  0
  • Jiveman  · 技术社区  · 5 年前

    有办法去吗 关键词是 自动地


    更多背景和例子

    订购项目 (1-3个)。什么时候 订购项目 是从订单中添加/删除的,父级 秩序 自身需要更新以存储最后修改的时间戳。

    public interface IModifiableEntity
    {
        DateTime LastModifiedOn { get; set; }
    }
    
    public class Order : IModifiableEntity
    {
        // some Order fields here...
    
        // timestamp for tracking when the order was changed
        public DateTime LastModifiedOn { get; set; }
    
        // list of order items in a child collection 
        public ICollection<OrderItem> OrderItems { get; set; }
    }
    
    public class OrderItem
    {
        public int OrderId { get; set; }
        // other order item fields...
    }
    

    public void AddOrderItem(OrderItem orderItem)
    {
        var order = _myDb.Orders.Single(o => o.Id == orderItem.OrderId);
        order.OrderItems.Add(orderItem);
        _myDb.SaveChanges();
    }
    

    SaveChanges

    public override int SaveChanges()
    {
        var timestamp = DateTime.Now;
    
        foreach (var modifiableEntity in ChangeTracker.Entries<IModifiableEntity>())
        {
            if (modifiableEntity.State == EntityState.Modified)
            {
                modifiableEntity.Entity.UpdatedOn = timestamp;
            }
        }
    
        return base.SaveChanges();
    }
    

    IModifiableEntity 更新。然后,该实体的状态将标记为 Modified SaveChanges() 上面将捕获它并正确设置时间戳字段。

    问题是,如果仅与子集合属性交互,则父实体不会标记为 modified 英孚。我知道我可以手动通过 context.Entry(myEntity).State 或者只需手动设置 LastModifiedOn 字段在应用程序逻辑中添加子项时,但这不会集中完成,而且很容易忘记。

    public void AddOrderItem(OrderItem orderItem)
    {
        var order = _myDb.Orders.Single(o => o.Id == orderItem.OrderId);
        order.OrderItems.Add(orderItem);
    
        // this works but is very manual and EF infrastructure specific
        _myDb.Entry(order).State = EntityState.Modified;
    
        // this also works but is very manual and easy to forget
        order.LastModifiedOn = DateTime.Now;
    
        _myDb.SaveChanges();
    }
    

    我是否可以集中执行此操作并通知EF需要将父子关系的“根”实体标记为已更新?

    0 回复  |  直到 5 年前