Intranet应用程序 - 单独项目中的数据访问

时间:2014-01-07 15:22:28

标签: asp.net-mvc entity-framework

我有一个使用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为空

1 个答案:

答案 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;
}