0

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

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

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

谢谢

4

2 回答 2

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

我想补充一点,数据库触发器可以(也许应该)实现更可靠的时间跟踪。现在你依赖于客户的时钟。

于 2013-02-02T22:18:02.317 回答
0

您可以在您想要的所有存储库方法中使用以下代码来执行此操作。

     public virtual void Edit(TEntity entity)
     {
          entity.Modified=DateTime.Now;
          entity.ModifiedBy=User.Identity.Name;
          //Other saving to repository code
     }
于 2013-02-01T10:02:26.607 回答