我们所有的数据库表都有UpdateUserID和UpdateTS。如果我的实体有变化,我想要这套。有没有办法可以有条件地在现场进行此更新?
如果我在代码中手动设置UpdateTS,那么它会说我的实体已更改并将始终更新该对象。
答案 0 :(得分:7)
我在调用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
事件来做类似的事情。
答案 1 :(得分:6)
以下是其他两个想法的实现,并考虑以下因素
EntityState.Unmodified
,并且不会更新上次修改的时间戳。EntityState.Added
)守则
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();
}
答案 2 :(得分:3)
您应该能够处理SavingChanges事件(example here)并执行@sander
概述的逻辑答案 3 :(得分:0)
我无法使用@ eric-j提出的解决方案,它只能在创建新对象时设置日期,而在更新时不能设置日期。
我找到了this solution,并对其进行了修改以使其看起来相似。尝试了一下,它就像一个魅力。
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();
}