【问题标题】:How can I automatically set a DateUpdated column using the Entity Framework?如何使用实体框架自动设置 DateUpdated 列?
【发布时间】:2009-08-20 21:06:40
【问题描述】:

我有一堆包含 DateUpdated 列的表。

当调用SaveChanges() 时对象被持久化回数据存储时,我如何才能将这些字段自动设置为DateTime.Now。

我不需要用一段代码来完成它。我可以在所有部分类中添加事件处理程序,但我没有看到任何可以挂钩的东西。而且我宁愿将它保留在代码中,而不是向数据库中添加触发器。

这是我的想法:

我认为我可以在 ObjectContext.SavingChanges 事件上做一些疯狂的反射自动,但我认为这不是最好的解决方案。

或者,我可以添加一个包含DateUpdated 属性的接口,并使用具有该字段的所有类来实现它。然后使用 ObjectContext.SavingChanges 事件为实现该接口的所有已更改对象设置属性。

有什么想法吗?

提前致谢!

【问题讨论】:

    标签: c# asp.net sql-server entity-framework objectcontext


    【解决方案1】:

    这是我认为数据库触发器实际上有一些实用性的极少数情况之一。通常我非常不喜欢他们……他们有将业务逻辑隐藏在系统最黑暗角落的习惯。但是,对于像上次修改日期这样简单的事情,我认为它们可能是最简单、最具可扩展性和整体性能最佳的解决方案。

    【讨论】:

      【解决方案2】:

      就我个人而言,我会为我的表创建一个自定义对象来继承。您可以将表的基本类型设置为此对象,然后从那里开始使用它。这允许您覆盖 OnPropertyChanged,以便在更改表上的任何属性时执行它。如果您可以依靠您感兴趣的字段名为“DateUpdated”的约定,这将特别有用。这需要一些小的反射魔法,但并不多。

      using System.Reflection;
      public class TableBase : System.Data.Objects.DataClasses.EntityObject
      {
          protected override void OnPropertyChanged(string property)
          {
              base.OnPropertyChanged(property);
      
              if (property != "DateUpdated")
              {
                  PropertyInfo prop = this.GetType().GetProperty("DateUpdated");
                  if (prop != null && prop.PropertyType.IsAssignableFrom(typeof(DateTime)))
                  {
                      prop.SetValue(this, DateTime.Now, null);
                  }
              }
          }
      }
      

      将表的基本类型设置为 TableBase,如果它们具有“DateUpdated”属性,则该属性将变为 Datetime。现在,只要更改任何属性。

      【讨论】:

      • 不幸的是,我认为每次实体更改时都会触发“OnPropertyChanged”事件,即使正在加载数据也是如此。所以我认为在这种情况下进行选择会导致字段更新。
      • 没关系。进一步的实验表明,Base Type 被硬连线为同一模型中的表实体,使其无法用于此目的。在 Linq for SQL 中容易得多。
      • 我意识到这很可能不是问题域,但此解决方案在 EF Code First 中不可用。
      猜你喜欢
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-14
      • 1970-01-01
      • 2011-03-02
      相关资源
      最近更新 更多