【问题标题】:asp.net MVC created_by, modified_by, created_time, modified_time autoHandlingasp.net MVC created_by、modified_by、created_time、modified_time 自动处理
【发布时间】:2018-12-23 01:07:49
【问题描述】:

我是 ASP.net MVC 的新手,开始使用代码优先模型
在我几乎所有的数据库表中,我都有 4 个相同的字段

  1. created_by :not null(仅创建时的用户 ID)
  2. modified_by :null 允许(每次编辑将保存最后一次修改的用户 ID)
  3. created_time :not null(当前日期时间)
  4. modified_time:null 允许(每次编辑都会保存上次修改的日期时间)

我想要一些函数来一次对所有表进行全局管理,但要像这样检查

private function CreatedModified(){
   if(action==create){
       model.created_by = current_login_user_id;
       model.created_time = current_datetime
   }else if(action==edit){
       model.modified_by = current_login_user_id; 
       model.modified_time = current_datetime;
   }
}

请帮我完成这个功能,我可以把它放在哪里。因为在每个模型构造中编写相同的函数看起来不太好。

【问题讨论】:

  • 你使用的是哪个 ORM?

标签: c# entity-framework code-first


【解决方案1】:

已经有一段时间了,但在您的 DbContext 中,您可以覆盖 SaveChangesAsync。我将用一些伪代码函数修复一个示例。

更新我会尝试修复一个更具体的例子

//you can put this anywhere you want
public interface IAuditableEntity
{
    //helper interface. put it on the entities you want to trace.
    string created_by {get;set;}
    DateTime created_time {get;set;}

    //todo: add more properties like 'modified'
}

把这个接口放在你要追踪的实体上:

//Here you reuse the interface
public class YourTableEntity : IAuditableEntity
{
    //implement members...
}

然后在您的数据上下文中:

public override Task<int> SaveChangesAsync(CancellationToken cancellationToken)
{
    WriteAutoData();
    return base.SaveChangesAsync(cancellationToken);
}

//just a helper function
private void WriteAutoData()
{
    foreach (var entry in ChangeTracker.Entries().OfType<IAuditableEntity>().Where(c =>
        c.State != EntityState.Detached &&
        c.State != EntityState.Unchanged))
    {
        //the `entry` is of type IAuditableEntity, so you can access it's members
        if (entry.State == EntityState.Added)
        {
            entry.created_by = "your user";
            entry.created_time = DateTime.UtcNow;
        }
        else if (entry.State == EntityState.Modified)
        {
            //modified data here
        }

        else if (entry.State == EntityState.Deleted)
            //deleted logic here: you are not using this. You could use it to log a delete
    }
}

【讨论】:

  • 你能不能让它更简单一点,我无法完成这个,这段代码应该放在哪个文件中,在IAuditableEntity接口中写什么?我正在使用 vs 2017 fw:4.6.1
  • @alamnaryab:我试着让它变得更容易,如果你能够管理它,请告诉我。
猜你喜欢
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-13
  • 2010-12-24
  • 1970-01-01
  • 2010-09-16
相关资源
最近更新 更多