【发布时间】:2014-01-07 15:22:28
【问题描述】:
我有一个使用 EF 6 的 MVC Intranet 应用程序。我已经在一个单独的类库中设置了 DataAccess 项目,该类库引用了 EF 6。我有一个实现接口的实体:
public interface IAuditable
{
DateTime CreatedDateTime { get; set; }
string CreatedBy { get; set; }
}
public class Collection : IAuditable
{
// Properties
}
但是,在 SaveChanges 方法中,我显然无法访问 HttpContext.Current.User.Identity.Name,因为它位于单独的类库中,所以我想知道如何在 SaveChanges 中设置它?
public override int SaveChanges()
{
var addedEntries = ChangeTracker.Entries().Where(x => x.State == EntityState.Added);
foreach (var dbEntityEntry in addedEntries)
{
var entity = dbEntityEntry.Entity as IAuditable;
if (entity != null)
{
entity.CreatedDateTime = DateTime.Now;
// how do I set entity.CreatedBy = HttpContext.Current.User.Identity.Name?
}
}
return base.SaveChanges();
}
编辑
继@CodeCaster 解决方案之后,我有以下内容:
[BreezeController]
public class BreezeController : ApiController
{
private readonly BTNIntranetRepository _repository;
public BreezeController(BTNIntranetRepository repository)
{
_repository = repository;
_repository.LoggedInUser = HttpContext.Current.User.Identity.Name;
}
// Methods
}
但HttpContext.Current.User 为空
【问题讨论】:
-
您的
HttpContext.Current.User为空是一个完全不同的问题,这可能与您设置身份验证和 IoC 容器的方式有关。它在动作方法中设置了什么?一个技巧是每次在使用它之前在存储库上设置它,但在这种情况下你可能会做entity.CreatedBy=...。 -
我已经启用了 Windows 身份验证,如果我没有在构造函数中设置它(例如在 ApiController 上的方法之一),我可以看到
Identity.Name的值,但如果我这样做了, 那么User为空
标签: asp.net-mvc entity-framework