C# asp.net MVC创建人、修改人、创建时间、修改时间自动处理
我是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
在几乎所有的数据库表中,我有4个相同的字段
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?