GenericRepository TEntity更改属性值

时间:2013-02-01 09:56:58

标签: entity-framework repository-pattern code-first

我正在使用EF 5.0和模型第一种方法。我已经构建了一个GenericRepository,它具有基本的get,insert,delete等语句。像:

public virtual void Insert(TEntity entity)
{
      dbSet.Add(entity);
}

我的EF实体都具有Modified和ModifiedBy属性。现在我想在每次保存实体时更改此值。 是否可以在不编写特定实现的情况下修改这两个属性(设置值)?

谢谢

2 个答案:

答案 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
     }