2014-04-28 6 views
6

यह प्रश्न विकसित हुआ है इसलिए मैंने शीर्षक अपडेट किया है। पहचान 2 UserManager.Find फेंकता "अमान्य ऑब्जेक्ट नाम 'dbo.ApplicationUser'" त्रुटिपहचान करने के लिए सरल स्मृति को माइग्रेट करना 2.0

मैं SimpleMembership से पहचान 2. को बदलने कर रहा हूँ मैं रूपांतरण स्क्रिप्ट भाग गया और किया है:

यह मूल शीर्षक था पहचान उपयोग के लिए विभिन्न फाइलों को दोहराया। मैं ऐप बना सकता हूं और चला सकता हूं लेकिन जब "अमान्य ऑब्जेक्ट नेम" dbo.AplicationUser '"को लॉगिन करने का प्रयास var उपयोगकर्ता = UserManager.Find (vM.UserName, vM.Password) पर फेंक दिया गया है;

खाता नियंत्रक:

[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 }); 
    } 
    } 

क्यों उपयोगकर्ता प्रबंधक dbo का उपयोग करने की कोशिश कर रहा है [ApplicationUser] (जो मौजूद नहीं है) डीबीओ के बजाय। [AspNetUsers]?

अद्यतन 1: मैं Microsoft.AspNet.Identity.EntityFramework 1.0 और Microsoft.AspNet.Identity.Core 1.0 के लिए डाउनग्रेड और अब मैं एक मिल "अमान्य ऑब्जेक्ट नाम 'dbo.IdentityUser'" त्रुटि जब UserManager.Find कहा जाता है।

अद्यतन 2:

मैं पहचान 2.0 करने के लिए वापस उन्नत किया और बस को देखने के लिए क्या ऊपर का समर्थन होगा और डेटाबेस हटा दिया और कोड के साथ यह पहली बार पुनर्जीवित (सक्षम-प्रवास करते हैं, अद्यतन-डेटाबेस)। के डिफ़ॉल्ट पहचान टेबल जोड़ने के

बजाय:
dbo.ApplicationUser
dbo.IdentityRole
dbo:
AspNetUserRoles
AspNetUsers


AspNetRoles
AspNetClaims
AspNetUserLogins यह इन तालिकाओं जोड़ा IdentityUserClaim
dbo.I dentityUserLogin
dbo.IdentityUserRole

जो यह बताएगा कि यह एप्लिकेशन यूज़र की तलाश क्यों कर रहा है। मेरे कॉन्फ़िगरेशन के बारे में क्या है जो मानक पहचान नामों के बजाय उन नामों को मजबूर कर रहा है? मैं शायद उन माइग्रेशन स्क्रिप्ट को उन नामों में बदल सकता हूं लेकिन फिर मैं गैर-मानक टेबल नामों के साथ समाप्त हो जाऊंगा जो केवल आगे बढ़ने के लिए भ्रम पैदा करेंगे। डिफ़ॉल्ट पहचान तालिका नाम प्राप्त करने के लिए मैं चीजों को कैसे कॉन्फ़िगर कर सकता हूं?

उत्तर

2

तालिका नामों के साथ समस्या ऑनमोडेल क्रिएटिंग के ओवरराइड के साथ थी। मेरी कॉल ईंटिटी < ...>()। हैस्की उन टेबल नामों का आह्वान कर रहे थे। ओवरराइड पर अधिक जानकारी के लिए ओलाव Nyb0 का जवाब यहां देखें: Asp.net Identity Validation Error।मैं करने के लिए OnModelCreating नवीनीकृत किया है:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
} 

मेरे ApplicationUser और प्रवास स्क्रिप्ट पहचान 1.0 पर मॉडलिंग रहे थे और मैं पहचान 2.0 के लिए उन्हें अपडेट करने की जरूरत है।

ApplicationUser:

public class ApplicationUser : IdentityUser 
    { 
    public int AcId { get; set; } 
    public int LcId { get; set; } 
    } 

यहाँ माइग्रेशन स्क्रिप्ट मुझे लगता है कि मैं अपने SimpleMembership डेटाबेस के खिलाफ चलाए साथ समाप्त हो गया है। मूल प्रश्न से थोड़ी दूर है, लेकिन मैं इसे किसी और को बचाने के लिए उम्मीद करता हूं, जिस घंटों में मैंने इसे समझ लिया था।

/****** Object: Table [dbo].[AspNetRoles] Script Date: 4/29/14 ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

IF OBJECT_ID('dbo.AspNetUserRoles', 'U') IS NOT NULL 
    DROP TABLE [dbo].[AspNetUserRoles] 
GO 
--IF OBJECT_ID('dbo.AspNetUserLogins', 'U') IS NOT NULL 
-- DROP TABLE [dbo].[AspNetUserLogins] 
--GO 
IF OBJECT_ID('dbo.AspNetUserClaims', 'U') IS NOT NULL 
    DROP TABLE [dbo].[AspNetUserClaims] 
GO 
IF OBJECT_ID('dbo.AspNetRoles', 'U') IS NOT NULL 
    DROP TABLE [dbo].[AspNetRoles] 
GO 
IF OBJECT_ID('dbo.AspNetUsers', 'U') IS NOT NULL 
    DROP TABLE [dbo].[AspNetUsers] 
GO 

CREATE TABLE [dbo].[AspNetUsers] (
    [Id]          NVARCHAR (128) NOT NULL, 
    [UserName]        NVARCHAR (15) NULL, 
    [AcId]         INT   NOT NULL, 
    [LcId]         INT   NOT NULL, 
    [Email]         NVARCHAR (256) NULL, 
    [EmailConfirmed]       BIT   DEFAULT ((0)) NULL, 
    [PasswordHash]       NVARCHAR (MAX) NULL, 
    [SecurityStamp]       NVARCHAR (MAX) NULL, 
    [PhoneNumber]        NVARCHAR (MAX) NULL, 
    [PhoneNumberConfirmed]     BIT   DEFAULT ((0)) NULL, 
    [TwoFactorEnabled]      BIT   DEFAULT ((0)) NULL, 
    [LockoutEndDateUtc]      DATETIME  NULL, 
    [Lockoutenabled]       BIT   DEFAULT ((0)) NULL, 
    [AccessFailedCount]      INT   DEFAULT ((0)) NOT NULL, 
    [Discriminator]       NVARCHAR (128) NOT NULL, 
    [CreateDate]        DATETIME  NULL, 
    [ConfirmationToken]      NVARCHAR (128) NULL, 
    [IsConfirmed]        BIT   DEFAULT ((0)) NULL, 
    [LastPasswordFailureDate]     DATETIME  NULL, 
    [PasswordFailuresSinceLastSuccess]  INT   DEFAULT ((0)) NULL, 
    [PasswordChangedDate]      DATETIME  NULL, 
    [PasswordVerificationToken]    NVARCHAR (128) NULL, 
    [PasswordVerificationTokenExpirationDate] DATETIME  NULL, 
    CONSTRAINT [PK_dbo.AspNetUsers] PRIMARY KEY CLUSTERED ([Id] ASC) 
); 
GO 
CREATE TABLE [dbo].[AspNetRoles] (
    [Id] NVARCHAR (128) NOT NULL, 
    [Name] NVARCHAR (256) NOT NULL, 
    CONSTRAINT [PK_dbo.AspNetRoles] PRIMARY KEY CLUSTERED ([Id] ASC) 
); 
GO 
CREATE TABLE [dbo].[AspNetUserRoles] (
    [UserId] NVARCHAR (128) NOT NULL, 
    [RoleId] NVARCHAR (128) NOT NULL, 
    CONSTRAINT [PK_dbo.AspNetUserRoles] PRIMARY KEY CLUSTERED ([UserId] ASC, [RoleId] ASC), 
    CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId] FOREIGN KEY ([RoleId]) REFERENCES [dbo].[AspNetRoles] ([Id]) ON DELETE CASCADE, 
    CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId] FOREIGN KEY ([UserId]) REFERENCES [dbo].[AspNetUsers] ([Id]) ON DELETE CASCADE 
); 
GO 
CREATE NONCLUSTERED INDEX [IX_RoleId] 
    ON [dbo].[AspNetUserRoles]([RoleId] ASC); 
GO 
CREATE NONCLUSTERED INDEX [IX_UserId] 
    ON [dbo].[AspNetUserRoles]([UserId] ASC); 
GO 
CREATE TABLE [dbo].[AspNetUserLogins] (
    [UserId]  NVARCHAR (128) NOT NULL, 
    [LoginProvider] NVARCHAR (128) NOT NULL, 
    [ProviderKey] NVARCHAR (128) NOT NULL, 
    CONSTRAINT [PK_dbo.AspNetUserLogins] PRIMARY KEY CLUSTERED ([UserId] ASC, [LoginProvider] ASC, [ProviderKey] ASC), 
    CONSTRAINT [FK_dbo.AspNetUserLogins_dbo.AspNetUsers_UserId] FOREIGN KEY ([UserId]) REFERENCES [dbo].[AspNetUsers] ([Id]) ON DELETE CASCADE 
); 
GO 
CREATE NONCLUSTERED INDEX [IX_UserId] 
    ON [dbo].[AspNetUserLogins]([UserId] ASC); 
GO 

CREATE TABLE [dbo].[AspNetUserClaims] (
    [Id]   INT   IDENTITY (1, 1) NOT NULL, 
    [ClaimType] NVARCHAR (MAX) NULL, 
    [ClaimValue] NVARCHAR (MAX) NULL, 
    [UserId] NVARCHAR (128) NOT NULL, 
    CONSTRAINT [PK_dbo.AspNetUserClaims] PRIMARY KEY CLUSTERED ([Id] ASC), 
    CONSTRAINT [FK_dbo.AspNetUserClaims_dbo.AspNetUsers_User_Id] FOREIGN KEY ([UserId]) REFERENCES [dbo].[AspNetUsers] ([Id]) ON DELETE CASCADE 
); 
GO 
CREATE NONCLUSTERED INDEX [IX_User_Id] 
    ON [dbo].[AspNetUserClaims]([UserId] ASC); 
GO 

INSERT INTO AspNetUsers(Id, UserName, BaId, OfcId, PasswordHash, SecurityStamp, Discriminator, 
CreateDate, ConfirmationToken, IsConfirmed, LastPasswordFailureDate, PasswordFailuresSinceLastSuccess, 
PasswordChangedDate, PasswordVerificationToken, PasswordVerificationTokenExpirationDate) 
SELECT UserProfile.UserId, UserProfile.UserName, UserProfile.BaId, UserProfile.OfcId, 
webpages_Membership.Password, webpages_Membership.PasswordSalt, 'User', CreateDate, 
ConfirmationToken, IsConfirmed, LastPasswordFailureDate, PasswordFailuresSinceLastSuccess, 
PasswordChangedDate, PasswordVerificationToken, PasswordVerificationTokenExpirationDate 
FROM UserProfile 
LEFT OUTER JOIN webpages_Membership ON UserProfile.UserId = webpages_Membership.UserId 
GO 

INSERT INTO AspNetRoles(Id, Name) 
SELECT RoleId, RoleName 
FROM webpages_Roles 
GO 

INSERT INTO AspNetUserRoles(UserId, RoleId) 
SELECT UserId, RoleId 
FROM webpages_UsersInRoles 
GO 

IF OBJECT_ID('dbo.webpages_OAuthMembership', 'U') IS NOT NULL 
    DROP TABLE [dbo].[webpages_OAuthMembership] 
GO 

IF OBJECT_ID('dbo.webpages_UsersInRoles', 'U') IS NOT NULL 
    DROP TABLE [dbo].[webpages_UsersInRoles] 
GO 
IF OBJECT_ID('dbo.webpages_Roles', 'U') IS NOT NULL 
    DROP TABLE [dbo].[webpages_Roles] 
GO 
IF OBJECT_ID('dbo.UserProfile', 'U') IS NOT NULL 
    DROP TABLE [dbo].[UserProfile] 
GO 
IF OBJECT_ID('dbo.webpages_Membership', 'U') IS NOT NULL 
    DROP TABLE [dbo].[webpages_Membership] 
GO 

--INSERT INTO AspNetUserLogins(UserId, LoginProvider, ProviderKey) 
--SELECT UserId, Provider, ProviderUserId 
--FROM webpages_OAuthMembership 
--GO 

मैं सामाजिक लॉगिन इसलिए AspNetUserLogins में सम्मिलित से बाहर टिप्पणी का उपयोग नहीं (आप हालांकि पहचान 2.0 के बाद से यह उम्मीद कर रही है तालिका बनाने के लिए की जरूरत है)।

पहचान 2.0 AspNetUsers तालिका डिफ़ॉल्ट रूप से इन क्षेत्रों में है:
[ID]
[ईमेल]
[EmailConfirmed]
[PasswordHash]
[SecurityStamp]
[PHONENUMBER]
[PhoneNumberConfirmed]
[TwoFactorEnabled]
[LockoutEndDateUtc]
[LockoutEnabled]
[AccessFailedCount]
[उपयोगकर्ता नाम]

मैं अभी भी प्रयोग कर रहा हूँ, क्या आप webpages_Membership तालिका में माइग्रेट करना है के रूप में अपने सबसे अच्छे निर्णय का उपयोग करें। इस बिंदु पर मैं हालांकि लॉगिन कर सकते हैं।

अद्यतन:

मेरी ApplicationUser में मैं उपयोगकर्ता नाम क्षेत्र छोटा करने के लिए अधिरोहित था। ऐसा न करें, यह प्रमाणीकरण त्रुटि का कारण बन जाएगा। आप माइग्रेशन स्क्रिप्ट में फ़ील्ड लम्बाई को नियंत्रित कर सकते हैं। मैंने ओपी में ओवरराइड हटा दिया है। अधिक जानकारी के लिए देख User.IsInRole failing.

ApplicationUser:

public class ApplicationUser : IdentityUser 
    { 
    // [StringLength(15)] // do not override UserName, will cause authentication error. 
    // public new string UserName { get; set; } 
    public int AcId { get; set; } 
    public int LcId { get; set; } 
    // public string ConfirmationToken { get; set; } // Depends on your app if you need to migrate these fields 
    // public bool IsConfirmed { get; set; } 
    // public string PasswordResetToken { get; set; } 
    } 
संबंधित मुद्दे