Entity framework 在DbContext中获取用户信息
我正试图使用EF迁移来构建/设置数据库种子,但在使用update database命令时,我的DbContext导致错误 我实现的DbContext有两个构造函数:一个不接受任何参数,另一个接受IUserContext接口。IUserContext接口以字符串形式返回用户名。IUserContext在SaveChanges()方法中用于设置与用户相关的审核字段(例如CreatedBy、UpdatedBy),这些字段对我的所有实体都是通用的。根据IUserContext接口的实现,可以从HttpContext(在mvc应用程序中)、WindowsIdentity(在控制台应用程序中)等检索用户名 如果用户尝试在DbContext上调用SaveChanges,但未设置IUserContext,则会引发异常。基本上,如果IUserContext接口无法提供用户名以记录修改者,我不希望在DbContext中保存更改。如果DbContext仅用于查询,那么使用no args构造函数不是问题,因为IUserContext仅在SaveChanges期间使用 当我尝试使用update database命令时,DBMIGRIONSCONFIGURATION将获得一个使用no args构造函数实例化的DbContext实例。因此,当它尝试在Seed()方法之后调用DbContext的SaveChanges时,会引发异常 问题:如何将IUserContext传递给我的DbContext,以便更新数据库命令不会失败,更重要的是,能够将适当的实体字段设置为播种更改的用户的名称?是否有某种形式的DI或其他定制我可以在DbMigrationsConfiguration中执行?我是否应该简单地向DbContext添加一个IUserContext访问器方法,以便可以在构造函数之外设置IUserContextEntity framework 在DbContext中获取用户信息,entity-framework,ef-code-first,dbcontext,Entity Framework,Ef Code First,Dbcontext,我正试图使用EF迁移来构建/设置数据库种子,但在使用update database命令时,我的DbContext导致错误 我实现的DbContext有两个构造函数:一个不接受任何参数,另一个接受IUserContext接口。IUserContext接口以字符串形式返回用户名。IUserContext在SaveChanges()方法中用于设置与用户相关的审核字段(例如CreatedBy、UpdatedBy),这些字段对我的所有实体都是通用的。根据IUserContext接口的实现,可以从HttpC
也许我应该问一个更大的问题:什么是最好的(最通用的?)将用户信息中继到DbContext以记录谁在进行修改的方法?我考虑过将此逻辑移动到应用程序的业务层,但将其封装在DbContext的SaveChanges中似乎非常方便(启用更改跟踪时更是如此).我们有一个类似的情况,即在SaveChanges()覆盖中记录修改后的用户。我们最终做的是创建一个BaseWrapper并使用IoC填充它。第二部分是创建MigrationContextFactory,migrations将使用该工厂创建上下文。此类与我们的ApplicationDbContext位于同一文件夹中
using System.Data.Entity.Infrastructure;
namespace MyApp.Data
{
public class MigrationsContextFactory : IDbContextFactory<ApplicationDbContext>
{
public ApplicationDbContext Create()
{
return new ApplicationDbContext(new HttpContextBaseWrapper());
}
}
}
public class HttpContextBaseWrapper : IHttpContextBaseWrapper
{
public string UserName
{
get
{
if (HttpContext.Current == null || HttpContext.Current.User == null)
return string.Empty;
return HttpContext.Current.User.Identity.Name;
}
}
}
使用System.Data.Entity.Infrastructure;
名称空间MyApp.Data
{
公共类迁移ContextFactory:IDbContextFactory我们有一个类似的情况,我们在SaveChanges()中记录修改过的用户重写。我们最终要做的是创建一个BaseWrapper并使用IoC填充它。第二部分是创建一个MigrationContextFactory,迁移将使用它创建上下文。此类与ApplicationDbContext位于同一文件夹中
using System.Data.Entity.Infrastructure;
namespace MyApp.Data
{
public class MigrationsContextFactory : IDbContextFactory<ApplicationDbContext>
{
public ApplicationDbContext Create()
{
return new ApplicationDbContext(new HttpContextBaseWrapper());
}
}
}
public class HttpContextBaseWrapper : IHttpContextBaseWrapper
{
public string UserName
{
get
{
if (HttpContext.Current == null || HttpContext.Current.User == null)
return string.Empty;
return HttpContext.Current.User.Identity.Name;
}
}
}
使用System.Data.Entity.Infrastructure;
名称空间MyApp.Data
{
公共类迁移ContextFactory:IDbContextFactory