C# 如何使用实体框架自动设置DateUpdated列?

C# 如何使用实体框架自动设置DateUpdated列?,c#,asp.net,sql-server,entity-framework,objectcontext,C#,Asp.net,Sql Server,Entity Framework,Objectcontext,我有一堆表,它们有更新日期的列 如何将这些字段自动设置为DateTime.Now当调用SaveChanges()时,将对象持久化回数据存储 我不需要用一段代码就可以做到一刀切。我可以在所有的部分类中添加事件处理程序,但我没有看到任何可以挂接的内容。我宁愿将其保存在代码中,也不愿向数据库中添加触发器 以下是我的想法: 我想我可以在ObjectContext.SavingChanges事件上进行一些疯狂的automagic反射,但我认为这不是最好的解决方案 或者,我可以添加一个包含DateUpdat

我有一堆表,它们有更新日期的列

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

我不需要用一段代码就可以做到一刀切。我可以在所有的部分类中添加事件处理程序,但我没有看到任何可以挂接的内容。我宁愿将其保存在代码中,也不愿向数据库中添加触发器

以下是我的想法:

我想我可以在ObjectContext.SavingChanges事件上进行一些疯狂的automagic反射,但我认为这不是最好的解决方案

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

有什么想法吗


提前谢谢

就我个人而言,我会创建一个自定义对象,让我的表从中继承。您可以将表的基本类型设置为该对象,然后从该对象开始使用它。这允许您重写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”事件,即使在加载数据时也是如此。所以我认为在这种情况下,选择会导致字段被更新。没关系。进一步的实验表明,基类型硬连接为同一模型中的表实体,因此无法用于此目的。在LINQforSQL中更容易使用。我意识到这很可能不是问题领域,但这个解决方案在EF代码中不可用。