2

我有一堆包含 DateUpdated 列的表。

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

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

以下是我的想法:

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

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

有任何想法吗?

提前致谢!

4

2 回答 2

3

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

于 2009-08-21T01:18:12.557 回答
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,只要更改任何属性。

于 2009-08-20T22:09:57.673 回答