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

时间:2009-08-20 21:06:41

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

我有一堆具有DateUpdated列的表。

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

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

以下是我的想法:

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

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

有什么想法吗?

提前致谢!

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

就个人而言,我会为我的表创建一个自定义对象来继承。您可以将表的基本类型设置为此对象,然后从那里进行播放。这允许您覆盖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.Now。