如何自动设置DateCreated和DateUpdated

Bar*_*art 4 .net c# sql-server entity-framework entity-framework-6

如果我有以下实体:

public class PocoWithDates {
    public string PocoName { get; set; }
    public DateTime DateCreated { get; set; }
   public DateTime DateUpdated { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

对应于具有相同名称/属性的SQL Server 2008(R2)表...

我怎样才能自动: -设定DateCreatedDateUpdated执行INSERT时场到现在-设置DateUpdated到现在外地做一个更新时,

当我自动说,我的意思是我希望能够这样做:

poco.Name = "Changing the name";
repository.Save(); 
Run Code Online (Sandbox Code Playgroud)

不是这个:

poco.Name = "Changing the name";
poco.LastModified = DateTime.Now;
repository.Save();
Run Code Online (Sandbox Code Playgroud)

在幕后,"某事"应该自动更新DateTime字段.什么是"东西"?我正在使用Entity Framework 6.0.EF可以自动执行此操作吗?我知道MySQL可以做这样的事情.或者在SQL Server中使用触发器/存储过程.但我不希望这样.

此问题是此问题的替代和更改版本: 实体框架/ SQL2008 - 如何自动更新实体的LastModified字段?

这个问题为EF 4.0提供了一些很好的解决方案/答案.但我希望它能用于EF6.0 DBContext.如果我有更多的时间,我会尝试调整这些解决方案,让他们在EF6.0中工作.但是现在我想知道是否有人已经解决了这个问题,或者知道如何将EF4.0 的自定义SaveChanges()Add()覆盖转录为EF6.0.

Jam*_*rne 5

您可以覆盖DbContext上的SaveChanges()方法以更新Save()上的DateUpdated值.我会实现一个接口,允许更新一些项目而不是其他项目.

public interface IEntityAutoDateFields
{
    DateTime DateCreated { get; set; }
    DateTime DateUpdated { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后:

public class PocoWithDates : IEntityAutoDateFields
{
    public PocoWithDates()
    {

    }

    public DateTime DateCreated { get; set; }
    public DateTime DateUpdated { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在您的背景下:

public PocoWithDatesContext : DbContext
{
     public DbSet<PocoWithDates> PocoWithDatesSet { get; set;}

     public override int SaveChanges()
     {
         var now = DateTime.Now;             

         this.ChangeTracker.DetectChanges();
         foreach (var item in this.ChangeTracker.Entries()
                               .Where(i => i.State == EntityState.Added || i.State == EntityState.Modified)
                               .Where(i => i as IEntityAutoDateFields != null))
         {
             if (item.State == EntityState.Added)
             {
                  (item as IEntityAutoDateFields).DateCreated = now;
             }
             (item as IEntityAutoDateFields).DateUpdated = now;
         }
         // Call the SaveChanges method on the context;
         return base.SaveChanges();
     }
}
Run Code Online (Sandbox Code Playgroud)