实体框架代码第一个DateTime字段更新修改

cri*_*nqr 7 c# datetime entity-framework ef-code-first ef-migrations

我有以下实体:

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; }
}
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*int 13

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

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

public interface IDatedEntity
{
    DateTimeOffset Created { get; set; }
    DateTimeOffset Updated { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

public class User : IDatedEntity
{
    // ...

    public DateTimeOffset Created { get; set; }
    public DateTimeOffset Updated { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

public class MyContext : DbContext
{
    public DbSet<User> 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<IDatedEntity>())
            {
                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();
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

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


mr1*_*100 0

您只能通过迁移来做到这一点。将 UpdateDate 属性的 defaultSqlValue 参数设置为“GETDATE()”或“GETUTCDATE()”,当您修改或添加新实体时,您需要将其值设置为 null。