我正在使用 EF 5.0 和模型优先方法。我已经构建了一个 GenericRepository,它具有基本的 get、insert、delete 等语句。像:
public virtual void Insert(TEntity entity)
{
dbSet.Add(entity);
}
我的 EF 实体都具有属性 Modified 和 ModifiedBy。现在我想在每次保存实体时更改此值。是否可以在不一直编写特定实现的情况下修改这两个属性(设置值)?
谢谢
我正在使用 EF 5.0 和模型优先方法。我已经构建了一个 GenericRepository,它具有基本的 get、insert、delete 等语句。像:
public virtual void Insert(TEntity entity)
{
dbSet.Add(entity);
}
我的 EF 实体都具有属性 Modified 和 ModifiedBy。现在我想在每次保存实体时更改此值。是否可以在不一直编写特定实现的情况下修改这两个属性(设置值)?
谢谢
我看到了两个选项供您执行此操作,但它们都需要为所有实体引入基本类型或接口,以在通用函数中覆盖它们。我更喜欢一个接口,尽管每个实体都必须一次又一次地实现它。
假设您创建
interface IAuditable
{
DateTime Modified { get; set; }
string ModifiedBy {get; set; } // User id?
}
现在你可以这样做:
public virtual void Insert(TEntity entity)
where TEntity : IAuditable
{
entity.Modified = DateTime.Now;
entity.ModifiedBy = ???? // Whatever you get the name from
...
}
(编辑相同)
您还可以订阅上下文的SavingChanges
事件:
// In the constructor:
context.SavingChanges += this.context_SavingChanges;
private void context_SavingChanges(object sender, EventArgs e)
{
foreach (var auditable in context.ObjectStateManager
.GetObjectStateEntries(EntityState.Added | EntityState.Modified)
.Select(entry => entry.Entity)
.OfType<IAuditable>)
{
auditable.Modified = DateTime.Now;
auditable.ModifiedBy = ????;
}
}
如果您与您合作,DbContext
您可以通过以下方式参加活动
((IObjectContextAdapter)this).ObjectContext.SavingChanges
我想补充一点,数据库触发器可以(也许应该)实现更可靠的时间跟踪。现在你依赖于客户的时钟。
您可以在您想要的所有存储库方法中使用以下代码来执行此操作。
public virtual void Edit(TEntity entity)
{
entity.Modified=DateTime.Now;
entity.ModifiedBy=User.Identity.Name;
//Other saving to repository code
}