c# - 如何自动设置 DateCreated 和 DateUpdated

标签 c# .net 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; }
}

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

我怎样才能自动: - 在执行 INSERT 时将 DateCreatedDateUpdated 字段设置为现在 - 在执行更新时将 DateUpdated 字段设置为现在

当我自动说时,我的意思是我希望能够做到这一点:

poco.Name = "Changing the name";
repository.Save(); 

不是这个:

poco.Name = "Changing the name";
poco.LastModified = DateTime.Now;
repository.Save();

在幕后,“某物”应该自动更新 DateTime 字段。那个“东西”是什么?我正在使用 Entity Framework 6.0。有没有一种方法可以让 EF 自动执行此操作?我知道 MySQL 可以做这样的事情。或者在 SQL Server 中使用触发器/存储过程。但我不想要那样。

这个问题是这个问题的替代和修改版本: Entity Framework/SQL2008 - How to Automatically Update LastModified fields for Entities?

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

最佳答案

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

public interface IEntityAutoDateFields
{
    DateTime DateCreated { get; set; }
    DateTime DateUpdated { get; set; }
}

然后:

public class PocoWithDates : IEntityAutoDateFields
{
    public PocoWithDates()
    {

    }

    public DateTime DateCreated { get; set; }
    public DateTime DateUpdated { get; set; }
}

在您的上下文中:

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();
     }
}

关于c# - 如何自动设置 DateCreated 和 DateUpdated,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21912058/

相关文章:

c# - JavaScript 转换为 C#

c# - 寻找 C# 代码解析器

.net - 通过 c++/cli 层从 c++ dll 使用 .net dll 时出现问题

c# - 如何删除 4 字节字符?

sql - 在 SQL Server 中存储 IP 地址最合适的数据类型是什么?

ASP.Net 嵌套转发器逻辑 hell

c# - 如何使用 .NET 捕获桌面视频?

c# - 使用 ErrorProvider 组件在 WinForms 中进行数据验证

c# - 如何在 C# Linq 中编写这个

sql - 如何使用SQL Server通过子节点中的值查找所有父节点