Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 在DbContext中获取用户信息_Entity Framework_Ef Code First_Dbcontext - Fatal编程技术网

Entity framework 在DbContext中获取用户信息

Entity 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

我正试图使用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访问器方法,以便可以在构造函数之外设置IUserContext


也许我应该问一个更大的问题:什么是最好的(最通用的?)将用户信息中继到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