entity-framework - 添加/删除子实体时如何在父实体上自动更新“LastModifiedDate”时间戳
问题描述
如果添加/删除/修改了父实体的任何依赖子项,是否有办法自动强制将父实体标记为已修改?关键词是自动。我知道这可以通过操作 DbEntry 的 EntityState 或通过手动设置父级中的时间戳字段来完成,但我需要在系统中的许多父子实体上完成此操作,因此希望拥有 EF(或相关组件)以某种方式自动执行此操作。
更多背景和例子
假设我们有一个Order和Order 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
非常有用。然后该实体的状态将由Modified
EF 标记,我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 需要将父子关系的“根”实体标记为已更新?
解决方案
推荐阅读
- netsuite - 当销售记录中的客户字段按值输入时,应自动填充自定义字段(主要联系人和主要电子邮件)的 Suitescript
- python - 熊猫分组和过滤
- python - 使用异步库的问题:aiomysql (python - bot)
- python - 在 matplotlib 中为标记和线条设置不同的颜色并在图例中显示它们
- c# - 为 Windows 社区工具包安装 Nuget - 尝试使用 TabView,构建错误
- python - 在 Python 速成课程中获取按钮呈现时遇到问题
- javascript - 使用 jQuery 替换具有命名 id 的两个 div 标签之间的内容(标签和文本)
- python-3.x - 如何在特定子列表之前插入元素?
- javascript - 如何让网页认为它在屏幕上?
- discord.js - 尝试获取 SQLite 值时,discord.js 机器人返回未定义