Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.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
C# Asp.net标识+工作单元:获取重复条目_C#_Asp.net Mvc_Entity Framework_Asp.net Identity - Fatal编程技术网

C# Asp.net标识+工作单元:获取重复条目

C# Asp.net标识+工作单元:获取重复条目,c#,asp.net-mvc,entity-framework,asp.net-identity,C#,Asp.net Mvc,Entity Framework,Asp.net Identity,我正在使用最新版本的ASP.NET Identity,使用示例项目作为基础模板。 我的更改很简单:向应用程序用户添加固定属性 因此,应用程序用户如下所示: public class ApplicationUser : IdentityUser { /// <summary> /// Gets or sets the firm. /// </summary> /// <value>

我正在使用最新版本的ASP.NET Identity,使用示例项目作为基础模板。 我的更改很简单:向应用程序用户添加固定属性

因此,应用程序用户如下所示:

   public class ApplicationUser : IdentityUser
    {
        /// <summary>
        /// Gets or sets the firm.
        /// </summary>
        /// <value>
        /// The firm.
        /// </value>
        public virtual Firm Firm { get; set; }

        /// <summary>
        /// Generates the user identity asynchronous.
        /// </summary>
        /// <param name="manager">The manager.</param>
        /// <returns>A claims identity</returns>
        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
        {
            //// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
            //// Add custom user claims here
            return userIdentity;
        }
    }
此外,我还实施了一个工作单元,负责公司和其他实体

 /// <summary>
    /// This contains a Unit of Work pattern Implementation. Provides access to all Elements used in this Application.
    /// </summary>
    public class UnitOfWork : IDisposable, IUnitOfWork
    {
        /// <summary>
        /// The database context
        /// </summary>
        private PriorityDBContext dbContext = new PriorityDBContext();

        public UnitOfWork(ApplicationDbContext dbContext)
        {
            this.dbContext = (PriorityDBContext)ApplicationDbContext;
        }

        private GenericRepository<Firm> firmRepository;

        public IGenericRepository<Firm> FirmRepository
        {
            get
            {
                if (this.firmRepository == null)
                {
                    this.firmRepository = new GenericRepository<Firm>(this.dbContext);
                }

                return this.firmRepository;
            }
        }
    }
现在我的问题是:我有一个帐户控制器,它可以创建新用户。当一个新的用户被创建时,公司会自动翻倍。我以前在数据库中有一家叫Example1的公司。现在我创建了一个新用户,突然数据库包含了两次Example1。 据我所知,根本原因是Asp.net标识使用了一个DbContext,我的UnitOfWork使用了另一个。我不确定为什么,我试图以一种在所有部分都使用相同DbContext的方式设置Ninject。但是,将相同的db上下文引入到UserManager和工作单元中会遇到巨大的问题:

[Authorize]
public class AccountController : Controller
{
/// <summary>
/// The Unit of Work
/// </summary>
private IUnitOfWork uoW;

/// <summary>
/// The _user manager
/// </summary>
private ApplicationUserManager userManager;

public AccountController(IUnitOfWork uow)
{
    this.uoW = uow;
}

/// <summary>
/// Gets the user manager.
/// </summary>
/// <value>
/// The user manager.
/// </value>
public ApplicationUserManager UserManager
{
    get
    {
        if (this.userManager == null)
        {
            this.userManager =  HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
        }

        return this.userManager;
    }

    private set
    {
        this.userManager = value;
    }
}

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
    bool success = true;

    if (ModelState.IsValid)
    {
                var firm = this.uoW.FirmRepository.GetRaw().Where(f => f.FirmName == newUser.Firm).First();
                var user = new ApplicationUser { FirstName = newUser.FirstName, LastName = newUser.LastName, Email = newUser.Email, UserName = newUser.Email, PreferredLanguage = newUser.Language, Firm = firm };

                var password = Guid.NewGuid().ToString();
                var result = await this.UserManager.CreateAsync(user, password);
                if (result.Succeeded)
                {
                    this.logger.Info("Created user for {0} successfully", newUser.Email);
                }
            }
        }
    }
}
}

Ninject,注册绑定:

private static void RegisterServices(IKernel kernel)
{
    /// loading the ApplicationDbContext here because the UserManager uses it from the OwinContext and if the
    /// Unit of Work defines it's own DBContext, bad things happen, e.g. duplicated objects when working with users AND our own pocos here.
    kernel.Bind<IUnitOfWork>().To<UnitOfWork>().WithConstructorArgument("dbContext", ninjectContext => HttpContext.Current.GetOwinContext().Get<ApplicationDbContext>());
    kernel.Bind<IGenericRepository<Firm>>().To<GenericRepository<Firm>>();
    //kernel.Bind<ApplicationUserManager>().To(HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>());
}
ApplicationUserManager:

  public class ApplicationUserManager : UserManager<ApplicationUser>
    {
        public ApplicationUserManager(IUserStore<ApplicationUser> store)
            : base(store)
        {
        }

        public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
        {
            var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
            //// Konfigurieren der Überprüfungslogik für Benutzernamen.
            manager.UserValidator = new UserValidator<ApplicationUser>(manager)
            {
                AllowOnlyAlphanumericUserNames = false,
                RequireUniqueEmail = true
            };

            // snipped

            return manager;
        }
    }

@tschmit007是的,这绝对是根本问题。但我完全不知道如何解决这个问题?我尝试使用Usermanager中的上下文,因为您无法注入DbContext,但这不起作用:为什么要修改CreateAync?