我有一堆具有DateUpdated列的表。
如果在调用DateTime.Now
时将对象持久化回数据存储,如何将这些字段自动设置为SaveChanges()
。
我不需要用一段代码全面完成。我可以在所有的部分类中添加事件处理程序,但我没有看到任何可以挂钩的东西。而且我宁愿将其保留在代码中,而不是向数据库添加触发器。
以下是我的想法:
我想我可以在ObjectContext.SavingChanges事件上做一些疯狂的反射自动化,但我不认为这是最好的解决方案。
或者,我可以添加一个包含DateUpdated
属性的接口,并使用具有该字段的所有类来实现它。然后使用ObjectContext.SavingChanges事件在实现该接口的所有已更改对象上设置属性。
有什么想法吗?
提前致谢!
答案 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。