【问题标题】:GenericRepository TEntity change attribute valueGenericRepository TEntity 更改属性值
【发布时间】:2013-02-03 06:18:02
【问题描述】:

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

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

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

谢谢

【问题讨论】:

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


    【解决方案1】:

    我看到您有两种选择来执行此操作,但它们都需要为您的所有实体引入基本类型或接口,以在通用函数中覆盖它们。我更喜欢一个接口,尽管每个实体都必须一次又一次地实现它。

    假设您创建

    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但我很好奇你为什么说“现在你依赖于客户的时钟”取决于 System.DateTime 是的,但是对客户的依赖在哪里?还是您只是指依赖运行代码的机器的时钟。在这种情况下,是的,它确实如此。有一个依赖注入解决方案。但那是另一个话题了。
    • @soadyp 是的,你是对的。运行代码的机器的时钟。很高兴指出这一点。 “客户”这个词太重了。
    【解决方案2】:

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

         public virtual void Edit(TEntity entity)
         {
              entity.Modified=DateTime.Now;
              entity.ModifiedBy=User.Identity.Name;
              //Other saving to repository code
         }
    

    【讨论】:

    猜你喜欢
    • 2021-11-24
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多