Questa domanda si è evoluta per cui ho aggiornato il titolo.Migrazione di SimpleMembership a Identity 2.0
questo era il titolo originale: Identità 2 UserManager.Find getta "Nome oggetto non valido 'dbo.ApplicationUser'" errore
sto conversione da SimpleMembership a Identità 2. Ho ho fatto funzionare lo script di conversione e refactored i vari file per l'uso di Identity. Posso creare ed eseguire l'app ma quando si tenta di accedere a un errore "Nome oggetto non valido 'dbo.ApplicationUser'" viene generato su var user = UserManager.Find (vM.UserName, vM.Password);
controllerAccount:
[RequireHttps]
[Authorize]
public class AccountController : Controller
{
private readonly IUserService _userService;
public UserManager<ApplicationUser> UserManager { get; private set; }
public AccountController()
: this(new UserService(), new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new MyDb()))) { }
public AccountController(IUserService userService, UserManager<ApplicationUser> userManager)
{ _userService = userService; UserManager = userManager; }
// GET: /Account/Login
[AllowAnonymous]
public ActionResult Login() { return View(); }
// POST: /Account/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginVm vM)
{
if (ModelState.IsValid)
{
var user = UserManager.Find(vM.UserName, vM.Password);
if (user != null)
{
FormsAuthentication.SetAuthCookie(user.UserName, false);
return RedirectToAction("Index", "Home");
}
}
ModelState.AddModelError("", "The user name or password provided is incorrect.");
return View(vM);
}
ApplicationUser:
public class ApplicationUser : IdentityUser
{
[StringLength(15)]
public new string UserName { get; set; }
public int AcId { get; set; }
public int LcId { get; set; }
public string ConfirmationToken { get; set; }
public bool IsConfirmed { get; set; }
public string PasswordResetToken { get; set; }
}
DbContext:.
public class MyDb : IdentityDbContext<ApplicationUser> // DbContext
{
public MyDb() : base("MyApplicaiton") { }
// public virtual DbSet<UserProfiles> Users { get; set; }
public virtual DbSet<MyTable> MyTables { get; set; } // properties marked virtual for Mocking override
...
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);
modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id);
modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });
}
}
Perché direttore utente tentando di accedere dbo [ApplicationUser] (che non esiste) piuttosto che dbo. [AspNetUsers]?
UPDATE 1: ho declassato a Microsoft.AspNet.Identity.EntityFramework 1.0 e 1.0 e Microsoft.AspNet.Identity.Core io ora ottenere un "nome oggetto non valido 'dbo.IdentityUser'" errore quando UserManager.Find è chiamato.
UPDATE 2:
ho aggiornato torna a Identità 2.0 e solo per vedere cosa sarebbe successo eseguito il backup e cancellato il database e rigenerata con il codice prima (Enable-migrazioni, update-database).
Invece di aggiungere le tabelle predefinite Identità di:
AspNetRoles
AspNetClaims
AspNetUserLogins
AspNetUserRoles
AspNetUsers
Essa ha aggiunto queste tabelle:
dbo.ApplicationUser
dbo.IdentityRole
dbo .IdentityUserClaim
dbo.I dentityUserLogin
dbo.IdentityUserRole
Che spiegherebbe perché è alla ricerca di ApplicationUser. Di cosa si tratta la mia configurazione che sta forzando quei nomi al posto dei nomi di identità standard? Probabilmente potrei cambiare il mio script di migrazione con quei nomi, ma poi finirei con nomi di tabelle non standard che porterebbero solo alla confusione in futuro. Come posso configurare le cose per ottenere i nomi delle tabelle Identity di default?