Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何首先在EF代码中创建/更新LastModified字段_C#_Entity Framework_Ef Code First - Fatal编程技术网

C# 如何首先在EF代码中创建/更新LastModified字段

C# 如何首先在EF代码中创建/更新LastModified字段,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,我想添加一个列,在将记录保存到磁盘时存储当前日期时间。实现这一目标的最佳方式是什么 我知道这不是一个非常复杂的问题,但我想知道EF是否有任何最佳实践或功能可以简化任务。 例如: 有没有办法将此字段的逻辑包含在table类中,以便在保存到磁盘时自动更新 修改或保存对象时是否有任何事件要捕获 不幸的是,没有您可以订阅的活动。我的建议是在您的上下文中重写SaveChanges方法,并在其中执行自定义逻辑(如果您希望保持它干净,可以公开您自己的事件) 编辑 我为此选择的一个解决方案是让我的所有实体从一

我想添加一个列,在将记录保存到磁盘时存储当前日期时间。实现这一目标的最佳方式是什么

我知道这不是一个非常复杂的问题,但我想知道EF是否有任何最佳实践或功能可以简化任务。 例如:

  • 有没有办法将此字段的逻辑包含在table类中,以便在保存到磁盘时自动更新
  • 修改或保存对象时是否有任何事件要捕获

不幸的是,没有您可以订阅的活动。我的建议是在您的上下文中重写SaveChanges方法,并在其中执行自定义逻辑(如果您希望保持它干净,可以公开您自己的事件)

编辑


我为此选择的一个解决方案是让我的所有实体从一个公共基类(例如EntityBase)继承,该基类公开了BeforeSave()和AfterSave()方法,在重写SaveChanges方法时,可以在自定义DbContext中调用这些方法(查看ChangeTracker中所有修改的条目)

一个选项是创建存储库层并实现您自己的保存更改

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();
}
public void SaveChanges()
{
foreach(Context.ChangeTracker.Entries()中的var条目,其中(x=>x.State==EntityState.Added&&x.Entity.CreatedAt==default(DateTime)))
entry.Entity.CreatedAt=DateTime.Now;
foreach(Context.ChangeTracker.Entries()中的var条目,其中(x=>x.State==EntityState.Added&&x.Entity.CreatedBy==null))
entry.Entity.CreatedBy=ContextManager.CurrentUser;
foreach(Context.ChangeTracker.Entries()中的var条目,其中(x=>x.State==EntityState.Modified))
entry.Entity.ModifiedAt=DateTime.Now;
foreach(Context.ChangeTracker.Entries()中的var条目,其中(x=>x.State==EntityState.Modified))
entry.Entity.ModifiedBy=ContextManager.CurrentUser;
SaveChanges();
}

这需要实现很多接口,但它应该可以工作。这是一个有趣的解决方案,但我希望简化我们的代码!:)我们将继续手动更新当前应用程序中的字段(它只是一个表,并且只从几个地方保存)。不管怎样,通过查看您的代码,我学到了一些东西,这总是很好的!(在未来的项目中,这可能是一个很好的解决方案)。谢谢