我想添加一个存储当前日期时间的记录保存到磁盘时的列。什么是实现这一目标的最佳方式?如何创建/更新EF代码中的LastModified字段首先
我知道这不是一个非常复杂的问题,但我不知道是否有任何的最佳做法或会简化任务EF的任何特征。 例如:
- 有没有什么办法,包括为表类中该领域的逻辑,这样,每当它保存到磁盘它会自动更新?
- 当对象被修改或保存时是否有任何事件需要捕获?
我想添加一个存储当前日期时间的记录保存到磁盘时的列。什么是实现这一目标的最佳方式?如何创建/更新EF代码中的LastModified字段首先
我知道这不是一个非常复杂的问题,但我不知道是否有任何的最佳做法或会简化任务EF的任何特征。 例如:
一个选项是创建存储库层和实现自己的SaveChanges
public void SaveChanges()
{
foreach (var entry in Context.ChangeTracker.Entries<ICreatedAt>().Where(x => x.State == EntityState.Added && x.Entity.CreatedAt == default(DateTime)))
entry.Entity.CreatedAt = DateTime.Now;
foreach (var entry in Context.ChangeTracker.Entries<ICreatedBy>().Where(x => x.State == EntityState.Added && x.Entity.CreatedBy == null))
entry.Entity.CreatedBy = ContextManager.CurrentUser;
foreach (var entry in Context.ChangeTracker.Entries<IModifiedAt>().Where(x => x.State == EntityState.Modified))
entry.Entity.ModifiedAt = DateTime.Now;
foreach (var entry in Context.ChangeTracker.Entries<IModifiedBy>().Where(x => x.State == EntityState.Modified))
entry.Entity.ModifiedBy = ContextManager.CurrentUser;
Context.SaveChanges();
}
不幸的是,没有您可以订阅的事件。我的建议是覆盖在您的上下文SaveChanges方法,做你的自定义逻辑存在(如果你要保持干净,你可以公开自己的事件)
编辑
一个解决方案,我挑了这是让我所有的实体从一个共同的基类(如EntityBase)暴露方法BeforeSave()和AfterSave(),你可以在自定义的DbContext覆盖SaveChanges方法时调用继承(看ChangeTracker所有修改的条目)
这是很多接口来实现,但它应该工作。 – hazimdikenli 2011-05-17 14:12:09
这是一个有趣的解决方案,但我期望简化我们的代码! :)我们将继续手动更新我们当前应用程序中的字段(它只是一个表格,并且只能从几个位置保存)。无论如何,通过查看代码,我学到了一些东西,它总是很棒的! (这可能是未来项目的一个很好的解决方案)。谢谢! – salgiza 2011-05-18 09:58:11