Asp.net mvc Net MVC保留CRUD函数的日志
在我的mvc应用程序中,我有一个基本模型,如下所示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")]
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
放入控制器中。将它嵌入到模型中是个坏主意,因为每次都必须创建一个新对象,然后才能从数据库中检索它。