首页 > 解决方案 > 添加/删除子实体时如何在父实体上自动更新“LastModifiedDate”时间戳

问题描述

如果添加/删除/修改了父实体的任何依赖子项,是否有办法自动强制将父实体标记为已修改?关键词是自动。我知道这可以通过操作 DbEntry 的 EntityState 或通过手动设置父级中的时间戳字段来完成,但我需要在系统中的许多父子实体上完成此操作,因此希望拥有 EF(或相关组件)以某种方式自动执行此操作。


更多背景和例子

假设我们有一个OrderOrder Items (1-many)。当从订单中添加/删除订单商品时,需要更新父订单本身以存储最后修改的时间戳。

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();
}

我已经有了一个模式来检测修改的实体并通过 EF 自动设置时间戳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();
}

如果更新了 an 上的任何直接字段,那将IModifiableEntity非常有用。然后该实体的状态将由ModifiedEF 标记,我SaveChanges()上面的自定义将捕获它并正确设置时间戳字段。

问题是,如果您只与子集合属性交互,则父实体不会modified被 EF 标记为。我知道在应用程序逻辑中添加子项时,我可以通过手动强制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 需要将父子关系的“根”实体标记为已更新?

标签: entity-frameworkentity-framework-coreentity-framework-6parent-child

解决方案


推荐阅读