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
,这将确保将新更新的日期值应用于所有已修改的实体.
您只能通过迁移来做到这一点。将 UpdateDate 属性的 defaultSqlValue 参数设置为“GETDATE()”或“GETUTCDATE()”,当您修改或添加新实体时,您需要将其值设置为 null。
归档时间: |
|
查看次数: |
6051 次 |
最近记录: |