gpt4 book ai didi

c# - 覆盖 SaveChanges 并设置 ModifiedDate,但如何设置 ModifiedBy?

转载 作者:IT王子 更新时间:2023-10-29 04:26:21 27 4
gpt4 key购买 nike

我有一个带有 UI、业务(实体)和数据 (DbContext) 层的 ASP.NET MVC3 Web 应用程序。我首先使用 Entity Framework 4.1 代码。现在,我正在覆盖数据层中的 DbContext.SaveChanges(),以便我可以为实现我的 的任何实体对象所做的所有更改设置 ModifiedDate >IAuditable 接口(interface)。我有一个返回 DateTime.Now 的静态 DateProvider 类和方法 (GetCurrentDate)(除非我正在运行测试,在这种情况下,它会返回我告诉它的任何内容).

我也想自动将 ModifiedBy 属性设置为当前用户。执行此操作的最佳方法是什么?框架中是否内置了允许我访问此信息的内容,或者我是否需要设置类似于 DateProvider 类的内容?这是一个 Active Directory 环境,我们在 IIS 中使用 WindowsAuthentication

这是我的 SaveChanges 代码:

public override int SaveChanges()
{
var changeSet = ChangeTracker.Entries<IAuditable>();

if (changeSet != null)
{
foreach (var entry in changeSet.Where(c => c.State != EntityState.Unchanged))
{
entry.Entity.ModifiedDate = DateProvider.GetCurrentDate();
}
}
return base.SaveChanges();
}

最佳答案

您可以使用 HttpContext.Current.User.Identity.Name 获取当前用户的名称。

public override int SaveChanges()
{
var changeSet = ChangeTracker.Entries<IAuditable>();

if (changeSet != null)
{
foreach (var entry in changeSet.Where(c => c.State != EntityState.Unchanged))
{
entry.Entity.ModifiedDate = DateProvider.GetCurrentDate();
entry.Entity.ModifiedBy = HttpContext.Current.User.Identity.Name;
}
}
return base.SaveChanges();
}

更好的方法是使用构造函数注入(inject)将当前用户传递给上下文

public class MyContext : DbContext
{
public MyContext(string userName)
{
UserName = userName;
}

public string UserName
{
get; private set;
}

public override int SaveChanges()
{
var changeSet = ChangeTracker.Entries<IAuditable>();

if (changeSet != null)
{
foreach (var entry in changeSet.Where(c => c.State != EntityState.Unchanged))
{
entry.Entity.ModifiedDate = DateProvider.GetCurrentDate();
entry.Entity.ModifiedBy = UserName;
}
}
return base.SaveChanges();
}
}

关于c# - 覆盖 SaveChanges 并设置 ModifiedDate,但如何设置 ModifiedBy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7641552/

27 4 0
文章推荐: c# - 为什么我不能从 List 转换为 List