2011-05-17 127 views
3

我想添加一个存储当前日期时间的记录保存到磁盘时的列。什么是实现这一目标的最佳方式?如何创建/更新EF代码中的LastModified字段首先

我知道这不是一个非常复杂的问题,但我不知道是否有任何的最佳做法或会简化任务EF的任何特征。 例如:

  • 有没有什么办法,包括为表类中该领域的逻辑,这样,每当它保存到磁盘它会自动更新?
  • 当对象被修改或保存时是否有任何事件需要捕获?

回答

2

一个选项是创建存储库层和实现自己的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(); 
} 
+0

这是很多接口来实现,但它应该工作。 – hazimdikenli 2011-05-17 14:12:09

+0

这是一个有趣的解决方案,但我期望简化我们的代码! :)我们将继续手动更新我们当前应用程序中的字段(它只是一个表格,并且只能从几个位置保存)。无论如何,通过查看代码,我学到了一些东西,它总是很棒的! (这可能是未来项目的一个很好的解决方案)。谢谢! – salgiza 2011-05-18 09:58:11

0

不幸的是,没有您可以订阅的事件。我的建议是覆盖在您的上下文SaveChanges方法,做你的自定义逻辑存在(如果你要保持干净,你可以公开自己的事件)

编辑

一个解决方案,我挑了这是让我所有的实体从一个共同的基类(如EntityBase)暴露方法BeforeSave()和AfterSave(),你可以在自定义的DbContext覆盖SaveChanges方法时调用继承(看ChangeTracker所有修改的条目)