Asp.net mvc Net MVC保留CRUD函数的日志

Asp.net mvc Net MVC保留CRUD函数的日志,asp.net-mvc,Asp.net Mvc,在我的mvc应用程序中,我有一个基本模型,如下所示 namespace ModulericaV1.Models { public class BaseModel { private ApplicationDbContext db = new ApplicationDbContext(); public DateTime? CrDate { get; set; } [ForeignKey("CrUser")]

在我的mvc应用程序中,我有一个基本模型,如下所示

namespace ModulericaV1.Models
{
    public class BaseModel 
    {      
        private ApplicationDbContext db = new ApplicationDbContext();

        public DateTime? CrDate { get; set; }

        [ForeignKey("CrUser")]
        public ApplicationUser UserCr { get; set; }
        public string CrUser { get; set; }

        public DateTime? MdDate { get; set; }

        [ForeignKey("MdUser")]
        public ApplicationUser UserMd { get; set; }
        public string MdUser { get; set; }

        public bool IsDeleted { get; set; }

        public ApplicationUser GetUserObject(string id) 
        {
            var UserObject = db.Users.Find(id);
            return UserObject;
        }


        public void LogBasic()
        {
            if (this.CrDate == null)
            {
                this.CrDate = System.DateTime.Now;
                this.CrUser = HttpContext.Current.User.Identity.GetUserId();
            }
            else
            {
                this.MdDate = System.DateTime.Now;
                this.MdUser = HttpContext.Current.User.Identity.GetUserId();
            }
        }
    }
}
我的所有模型都继承:BaseModel。我试图做的是,为所有创建和更新数据库查询调用LogBasic()方法,以便记录哪些用户创建了新行或进行了更改


我应该在哪里调用LogBasic()方法

这样的方法可能会奏效:

public class ApplicationDbContext  : DbContext {

    // ... 

    public override int SaveChanges () {
        if(HasChanges()){
            foreach(var entry in Entries<BaseModel>()){
                ((BaseModel)entry.Entity).LogBasic();
            }
        }
    }

    // ... 

}
公共类ApplicationDbContext:DbContext{
// ... 
公共覆盖int SaveChanges(){
if(HasChanges()){
foreach(Entries()中的var条目){
((BaseModel)entry.Entity).LogBasic();
}
}
}
// ... 
}

执行此操作的最佳位置是
SaveChanges()
方法上的
ApplicationDbContext
。您可以遍历所有挂起更新的项,如果它们属于
BaseModel
,则记录它们

我手头没有确切的语法,但我的想法是:

public class ApplicationDbContext : DbContext
{
    //.....

    public override int SaveChanges()
    {
       foreach(var entity in this.ChangeTracker.Entries)
       {
          var baseModel = entity as BaseModel;

          if(baseModel!=null)
          {        
             switch(entity.State)
             {
                case State.Modified;
                // Do things with an updated version
                case State.Deleted:
                // Do things with the deleted version
                case State.Added:
                {
                   // Do things with the Added entity
                   baseModel.LogBasic();
                   break;
                }
             }
         }

       base.SaveChanges();
    }      
}

你的创建和更新方法在哪里?我有30多个模型,每个模型都有自己的创建和更新方法。但是我不想从每个方法调用LogBasic()。我想为每个查询调用LogBasic(),这是一个更通用的查询。我认为这不是一个完美的设计,您要么需要有每次调用log方法的通用base create/update方法,要么创建base方法并每次从每个子项中重写的create/update方法调用base。要回显@stripthesoul,将
ApplicationDbContext
放入控制器中。将它嵌入到模型中是个坏主意,因为每次都必须创建一个新对象,然后才能从数据库中检索它。