【问题标题】:Identity 2.0 Adding extra Email columnIdentity 2.0 添加额外的电子邮件列
【发布时间】:2015-09-28 03:35:10
【问题描述】:

当我尝试登录我的开发站点时,我收到一个奇怪的错误:

列名“Email1”无效。

我为许多不同的 ASP.NET Identity 2.0 类创建了派生类,即:

public class MyUser : IdentityUser<int, MyLogin, MyUserRole, MyClaim>//, IUser<int>
{
    #region properties

    public string ActivationToken { get; set; }

    public string PasswordAnswer { get; set; }

    public string PasswordQuestion { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string TaxID { get; set; }

    public bool IsActive { get; set; }

    public bool IsApproved { get; set; }

    #endregion

    #region methods

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<MyUser, int> userManager)
    {
        var userIdentity = await userManager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    }

    #endregion
}

违规代码在 AccountController 的 Login 方法中对 UserManager.FindAsync() 的调用中:

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            var user = await UserManager.FindAsync(model.Email, model.Password);
            if (user != null)
            {
                await SignInAsync(user, model.RememberMe);
                return RedirectToLocal(returnUrl);
            }
            ModelState.AddModelError("", "Invalid username or password.");
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

我已经这样设计了我的用户表:

CREATE TABLE [dbo].[User]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Password] [nvarchar](50) NOT NULL,
    [FirstName] [nvarchar](50) NULL,
    [LastName] [nvarchar](50) NULL,
    [Email] [nvarchar](50) NOT NULL,
    [TaxID] [nvarchar](50) NULL,
    [PaymentMethodID] [int] NULL,
    [IsActive] [bit] NOT NULL DEFAULT 1,
    [IsApproved] [bit] NOT NULL,
    [IsLocked] [bit] NOT NULL,
    [CreationDate] [datetime] NULL,
    [ApprovalDate] [datetime] NULL DEFAULT NULL,
    [LastLoginDate] [datetime] NULL,
    [PasswordQuestion] [nvarchar](max) NULL,
    [PasswordAnswer] [nvarchar](max) NULL,
    [ActivationToken] [nvarchar](200) NULL,
    [EmailConfirmed] [bit] NOT NULL,
    [SecurityStamp] [nvarchar](max) NULL,
    [PhoneNumber] [nvarchar](50) NULL,
    [PhoneNumberConfirmed] [bit] NOT NULL,
    [TwoFactorEnabled] [bit] NOT NULL,
    [LockoutEndDateUtc] [datetime2](7) NULL,
    [LockoutEnabled] [bit] NOT NULL,
    [AccessFailedCount] [int] NOT NULL,
    CONSTRAINT [User_PK] PRIMARY KEY NONCLUSTERED ([ID]),
    CONSTRAINT [Email_UK] UNIQUE NONCLUSTERED([Email])
)

我正在 MyDbContext 的 OnModelCreating 方法中将 MyUser 类绑定到该表:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            // Map Entities to their tables.
            modelBuilder.Entity<MyUser>().ToTable("User");
            modelBuilder.Entity<MyRole>().ToTable("Role");
            modelBuilder.Entity<MyClaim>().ToTable("UserClaim");
            modelBuilder.Entity<MyLogin>().ToTable("UserLogin");
            modelBuilder.Entity<MyUserRole>().ToTable("UserRole");
            // Set AutoIncrement-Properties
            modelBuilder.Entity<MyUser>().Property(r => r.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
            modelBuilder.Entity<MyClaim>().Property(r => r.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
            modelBuilder.Entity<MyRole>().Property(r => r.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
            // Override some column mappings that do not match our default
            modelBuilder.Entity<MyUser>().Property(r => r.UserName).HasColumnName("Email");
            modelBuilder.Entity<MyUser>().Property(r => r.PasswordHash).HasColumnName("Password");
        }

Somewhere Identity 2.0 正在创建另一个它不应该创建的电子邮件列。有什么想法吗?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-5 asp.net-identity-2


    【解决方案1】:

    默认架构中已经有一个名为 Email 的列。

    正如@enki.dev 在他已删除的答案中所建议的那样,如果您查看IdentityUser 的定义,您已经定义了这些属性。

    你在这里做的事情很危险:

    modelBuilder.Entity<MyUser>().Property(r => r.UserName).HasColumnName("Email");
    modelBuilder.Entity<MyUser>().Property(r => r.PasswordHash).HasColumnName("Password");
    

    当您试图将一列强制转换为另一列时。属性 Email 已在此框架中广泛用于密码检索等。

    你可以试试改名

    modelBuilder.Entity<MyUser>().Property(r => r.Email).HasColumnName("Blah");
    

    所以你不会有重复的;但我猜你会在路上遇到很多其他问题。

    您为什么不简单地将电子邮件存储在UserName 属性中?

    另一个建议;让框架使用迁移为您创建表总是更好的,这样您总是知道发生了什么。

    从 Visual Studio 中选择菜单

    • 工具 - NuGet Packager Manager - 包管理器控制台

    在组合中选择您的项目:默认项目。

    运行Enable-Migrations

    它应该创建一个名为 Migrations 的文件夹和一个名为 Configuration.cs 的文件。

    构造函数应该如下所示:

    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
    }
    

    将值 AutomaticMigrationsEnabled 更改为 true

    返回Package Manager Console并运行

    Update-Database
    

    Update-Database -Force
    

    为您的表重新创建整个架构。

    那里有一个受保护的方法,您可以在其中查看您的数据:

    protected override void Seed(ASPNETIdentity2.Models.MyContext context)
    {
        //  This method will be called after migrating to the latest version.
    
        //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
        //  to avoid creating duplicate seed data. E.g.
        //
        //    context.People.AddOrUpdate(
        //      p => p.FullName,
        //      new Person { FullName = "Andrew Peters" },
        //      new Person { FullName = "Brice Lambson" },
        //      new Person { FullName = "Rowan Miller" }
        //    );
        //
    }
    

    【讨论】:

    • 谢谢,不是肯定这是问题,所以我删除它去测试我的机器上的东西,再也没有回来。很高兴知道。
    • 感谢左撇子的回答。我没有使用 EF Code-First 和迁移,而是使用 Database First。事实上,我已经在 SQL Server 数据库项目中定义了很多数据库。在这一点上,我会说很难将所有这些都切换到 Code First。话虽如此,所以当您说我应该将电子邮件存储在 UserName 列中时,您的意思是在数据库本身中?这意味着我可以摆脱这条线:codemodelBuilder.Entity().Property(r => r.UserName).HasColumnName("Email");一起来。
    • @sshirley:是的,这就是我的建议。将您的电子邮件保存在用户名字段和电子邮件字段中。你可以摆脱那条线,事情应该可以正常工作。
    • @leftyx 你能看看我的问题stackoverflow.com/questions/36929767/…
    猜你喜欢
    • 1970-01-01
    • 2010-12-20
    • 2021-08-27
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    相关资源
    最近更新 更多