asp.net identity 2.0 unity not resolving default user store

Michael picture Michael · Apr 22, 2014 · Viewed 12.6k times · Source

i get the following exception when trying to configure Unity using Unity.Mvc5 with an MVC 5 application using Identity 2.0 and the Identity 2.0 Samples boilerplate. i have read this SO Configure Unity DI for ASP.NET Identity and i'm still not clear on what i'm missing. What am i doing wrong here?

The current type, System.Data.Common.DbConnection, is an abstract class and cannot be constructed. Are you missing a type mapping?

[ResolutionFailedException: Resolution of the dependency failed, type = "myApp.Web.Controllers.AccountController", name = "(none)". Exception occurred while: while resolving.

Exception is: InvalidOperationException - The current type, System.Data.Common.DbConnection, is an abstract class and cannot be constructed. Are you missing a type mapping?

At the time of the exception, the container was:

Resolving myApp.Web.Controllers.AccountController,(none) Resolving parameter "userManager" of constructor myApp.Web.Controllers.AccountController(myApp.Web.Models.ApplicationUserManager userManager) Resolving myApp.Web.Models.ApplicationUserManager,(none) Resolving parameter "store" of constructor myApp.Web.Models.ApplicationUserManager(Microsoft.AspNet.Identity.IUserStore1[[myApp.Web.DAL.Profiles.ApplicationUser, myApp.Web, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] store) Resolving Microsoft.AspNet.Identity.EntityFramework.UserStore1[myApp.Web.DAL.Profiles.ApplicationUser],(none) (mapped from Microsoft.AspNet.Identity.IUserStore1[myApp.Web.DAL.Profiles.ApplicationUser], (none)) Resolving parameter "context" of constructor Microsoft.AspNet.Identity.EntityFramework.UserStore1[[myApp.Web.DAL.Profiles.ApplicationUser, myApp.Web, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]](System.Data.Entity.DbContext context) Resolving System.Data.Entity.DbContext,(none) Resolving parameter "existingConnection" of constructor System.Data.Entity.DbContext(System.Data.Common.DbConnection existingConnection, System.Data.Entity.Infrastructure.DbCompiledModel model, System.Boolean contextOwnsConnection) Resolving System.Data.Common.DbConnection,(none)

account controller as i have modified it

 public AccountController(ApplicationUserManager userManager)
 {
      _userManager = userManager;
 }

 private ApplicationUserManager _userManager;

containers i have registered

container.RegisterType<ApplicationUserManager>(new HierarchicalLifetimeManager());
container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(new HierarchicalLifetimeManager());

Answer

Casey picture Casey · Apr 23, 2014

I see you found a solution, but I think I have a simpler one.

You're using Entity Framework, right? So your application almost certainly has something inheriting from DbContext (probably inheriting from IdentityContext<TUser>, which in turn inherits from DbContext in this case). In the default template it's ApplicationDbContext.

In your composition root you can just add container.RegisterType<DbContext, ApplicationDbContext>(new HierarchicalLifetimeManager()); (obviously edit this if yours isn't called ApplicationDbContext).