我们所有的数据库表都有UpdateUserID和UpdateTS。如果我的实体有更改,我希望设置这个值。是否可以有一种条件方式来立即更新它呢?
如果我在代码中手动设置UpdateTS,则会认为我的实体已更改,并始终更新对象。
我们所有的数据库表都有UpdateUserID和UpdateTS。如果我的实体有更改,我希望设置这个值。是否可以有一种条件方式来立即更新它呢?
如果我在代码中手动设置UpdateTS,则会认为我的实体已更改,并始终更新对象。
代码
public interface IHasLastModified
{
DateTime? LastModified { get; set; }
}
public class MyClass : IHasLastModified
{
public virtual int Id { get; set; }
public virtual string SomeOtherProperty { get; set; }
public virtual DateTime? LastModified { get; set; }
}
public class MyContext : DbContext
{
public override int SaveChanges()
{
DateTime now = DateTime.UtcNow;
foreach (ObjectStateEntry entry in (this as IObjectContextAdapter).ObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified))
{
if (!entry.IsRelationship)
{
IHasLastModified lastModified = entry.Entity as IHasLastModified;
if (lastModified != null)
lastModified.LastModified = now;
}
}
return base.SaveChanges();
}
在调用 context.SaveChanges()
之前,我会调用这个扩展方法:
public static void SetLastModified(this ObjectContext context, DateTime dateTime)
{
DateTime now = DateTime.UtcNow;
foreach (ObjectStateEntry entry in context.ObjectStateManager.GetObjectStateEntries(EntityState.Modified))
{
if (!entry.IsRelationship)
{
IHasLastModified lastModified = entry.Entity as IHasLastModified;
if (lastModified != null)
lastModified.LastModified = now;
}
}
}
我可以轻松调用这段代码,因为我已经将ObjectContext封装在一个仓储类中。如果你直接使用它,你可以将ObjectContext.SavingChanges
事件连接起来实现类似的功能。
public override int SaveChanges()
{
var now = DateTime.UtcNow;
var entries = ChangeTracker
.Entries()
.Where(e => e.State == EntityState.Added || e.State == EntityState.Modified);
foreach (var entry in entries)
{
if (entry.Entity is IHasLastModified lastModified)
{
lastModified.LastModified = now;
if (entry.State == EntityState.Added)
{
lastModified.CreatedDate = now;
}
}
}
return base.SaveChanges();
}