entity framework代码第一个DateTime字段更新修改

我有以下实体:

public class User { public int UserId { get; set; } public string UserName { get; set; } public string UserAddress { get; set; } public DateTime CreateDate { get; set; } public DateTime? UpdateDate { get; set; } } 

如何使User实体的UpdateDate字段成为更新时的服务器DateTime ? 也就是说,每当数据库中的实体被修改时, UpdateDate字段就会更改为确切的日期和时间,以及是否要说UpdateDate = new DateTime(Datetime.Now.Ticks)

首先,如果要存储本地时间,请考虑DateTimeOffset是更好的选择。 或者,您可以使用基于UTC的DateTime ,但我将在此示例中显示DateTimeOffset 。 切勿为此目的存储基于本地的DateTime ,因为您将遇到时区和夏令时问题。 另请参阅: 针对DateTime.Now的案例 。

接下来,考虑一个通用接口,您可以将其用于要跟踪创建/更新值的实体。

 public interface IDatedEntity { DateTimeOffset Created { get; set; } DateTimeOffset Updated { get; set; } } 

将该接口及其属性应用于您正在使用的实体。

 public class User : IDatedEntity { // ... public DateTimeOffset Created { get; set; } public DateTimeOffset Updated { get; set; } } 

现在,在数据库上下文中,您可以附加到SavingChanges事件并应用所需的行为:

 public class MyContext : DbContext { public DbSet Users { get; set; } public MyContext() { var objectContext = ((IObjectContextAdapter)this).ObjectContext; objectContext.SavingChanges += (sender, args) => { var now = DateTimeOffset.Now; foreach (var entry in this.ChangeTracker.Entries()) { var entity = entry.Entity; switch (entry.State) { case EntityState.Added: entity.Created = now; entity.Updated = now; break; case EntityState.Modified: entity.Updated = now; break; } } this.ChangeTracker.DetectChanges(); }; } } 

请注意最终调用DetectChanges ,这将确保将新更新的日期值应用于所有已修改的实体。

您只能通过迁移执行此操作。 将UpdateDate属性的defaultSqlValue参数设置为“GETDATE()”或“GETUTCDATE()”,当您修改或添加新实体时,您需要将其值设置为null。