我正在使用EF 5.0和模型第一种方法。我已经构建了一个GenericRepository,它具有基本的get,insert,delete等语句。像:
public virtual void Insert(TEntity entity)
{
dbSet.Add(entity);
}
我的EF实体都具有Modified和ModifiedBy属性。现在我想在每次保存实体时更改此值。 是否可以在不编写特定实现的情况下修改这两个属性(设置值)?
谢谢
答案 0 :(得分:2)
我看到了两个选项,但是它们都需要为所有实体引入基类型或接口,以便在通用函数中覆盖它们。我更喜欢一个界面,尽管每个实体都必须一次又一次地实现它。
假设您创建了
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
我想补充一点,数据库触发器可以(也许应该)实现更可靠的时间跟踪。现在你依赖客户的时钟。
答案 1 :(得分:0)
您可以使用以下代码在您想要的所有存储库方法中执行此操作。
public virtual void Edit(TEntity entity)
{
entity.Modified=DateTime.Now;
entity.ModifiedBy=User.Identity.Name;
//Other saving to repository code
}