我有一个使用EF 6的MVC内部网应用程序。我已将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
为空
答案 0 :(得分:1)
这可以通过多种方式解决。
您并未真正展示相关代码,但您可以为库类提供公开的string LoggedInUser
(或ActingUser
或给它一个名称)属性,您在实例化它时会设置该属性:
public class SomeController : Controller
{
private IDataSource _dataSource;
public SomeController(IDataSource dataSource)
{
_dataSource = dataSource;
_dataSource.LoggedInUser = HttpContext.Current.User.Identity.Name
}
}
然后,您可以在IDataSource.SaveChanges()
方法中使用该属性:
public override int SaveChanges()
{
// ...
entity.CreatedBy = this.LoggedInUser;
}