C# asp.net MVC创建人、修改人、创建时间、修改时间自动处理

C# asp.net MVC创建人、修改人、创建时间、修改时间自动处理,c#,entity-framework,code-first,C#,Entity Framework,Code First,我是ASP.net MVC新手,开始使用代码优先模式 在几乎所有的数据库表中,我有4个相同的字段 创建人:不为空(仅创建时的用户id) 修改人:允许为空(每次编辑时将按用户id保存上次修改) 创建时间:不为空(当前日期时间) 修改时间:允许为空(每次编辑时将保存上次修改的日期时间) 我希望有一些函数可以对所有表同时进行全局管理,但需要像这样进行检查 private function CreatedModified(){ if(action==create){ model.cr

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

  • 创建人:不为空(仅创建时的用户id)
  • 修改人:允许为空(每次编辑时将按用户id保存上次修改)
  • 创建时间:不为空(当前日期时间)
  • 修改时间:允许为空(每次编辑时将保存上次修改的日期时间)
  • 我希望有一些函数可以对所有表同时进行全局管理,但需要像这样进行检查

    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;
       }
    }
    

    请帮助我使用此功能,并将其放置在何处。因为在每个模型构造中编写相同的函数看起来不太好。

    已经有一段时间了,但是在
    DbContext
    中,可以对
    savechangessync
    进行覆盖。我将用一些psuedo代码函数修复一个示例

    更新我将尝试修复一个更具体的示例

    //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
        }
    }
    
    public override Task savechangessync(CancellationToken CancellationToken)
    {
    WriteAutoData();
    返回base.saveChangesSync(cancellationToken);
    }
    //只是一个辅助函数
    私有void WriteAutoData()
    {
    foreach(类型()的ChangeTracker.Entries()中的var条目,其中(c=>
    c、 状态!=实体状态。已分离&&
    c、 状态!=EntityState.Unchanged)
    {
    //'entry'属于IAuditableEntity类型,因此您可以访问其成员
    if(entry.State==EntityState.Added)
    {
    entry.created_by=“您的用户”;
    entry.created_time=DateTime.UtcNow;
    }
    else if(entry.State==EntityState.Modified)
    {
    //在这里修改数据
    }
    else if(entry.State==EntityState.Deleted)
    //此处删除的逻辑:您没有使用此逻辑。您可以使用它记录删除
    }
    }
    
    你能不能让它简单一点,我无法完成这个,这个代码应该在哪个文件中,在
    IAuditableEntity
    界面中写什么?我正在使用VS2017 fw:4.6。1@alamnaryab:我试着让它更简单,如果你能管理它,请告诉我。你使用的是哪种ORM?