实体类型应用程序用户不是当前上下文的模型的一部分

本文关键字:上下文 模型 一部分 类型 应用程序 用户 实体 | 更新日期: 2023-09-27 18:31:19

我已经建立了一个新的 asp.net Web表单应用程序。我想使用我自己的实体框架数据模型,使用提供的 owin 身份验证创建登录和注册功能。

我已经将我的连接字符串从默认值更改为 IdentityModel 中的连接字符串.cs但在使用登录名时,我收到上述错误。

代码与默认值相同,当我将应用程序DBContext更改回默认连接时,它按预期工作。

我能够访问数据库中的数据,因为我使用 linq 查询来检查输入的电子邮件和密码。

该错误在登录用户控件中的以下行引发:

 var result = signinManager.PasswordSignIn(Email.Text, Password.Text, RememberMe.Checked, shouldLockout: false);

我需要做些什么才能使 owin 身份验证与提供的 DefaultConnection 以外的数据库一起工作?

代码片段:

生成的寄存器:

protected void CreateUser_Click(object sender, EventArgs e)
        {
            var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
            var signInManager = Context.GetOwinContext().Get<ApplicationSignInManager>();
            var user = new ApplicationUser() { UserName = Email.Text, Email = Email.Text };
            IdentityResult result = manager.Create(user, Password.Text);
            if (result.Succeeded)
            {    
                signInManager.SignIn( user, isPersistent: false, rememberBrowser: false);
                IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response);
            }
            else 
            {
                ErrorMessage.Text = result.Errors.FirstOrDefault();
            }
        }

生成的登录名:

protected void LogIn(object sender, EventArgs e)
        {
            if (IsValid)
            {
                // Validate the user password
                var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
                var signinManager = Context.GetOwinContext().GetUserManager<ApplicationSignInManager>();
                var result = signinManager.PasswordSignIn(Email.Text, Password.Text, RememberMe.Checked, shouldLockout: false);
                switch (result)
                {
                    case SignInStatus.Success:
                        IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response);
                        break;
                    case SignInStatus.LockedOut:
                        Response.Redirect("/Account/Lockout");
                        break;
                    case SignInStatus.RequiresVerification:
                        Response.Redirect(String.Format("/Account/TwoFactorAuthenticationSignIn?ReturnUrl={0}&RememberMe={1}", 
                                                        Request.QueryString["ReturnUrl"],
                                                        RememberMe.Checked),
                                          true);
                        break;
                    case SignInStatus.Failure:
                    default:
                        FailureText.Text = "Invalid login attempt";
                        ErrorMessage.Visible = true;
                        break;
                }

用于查找用户的 Linq 查询:

var myUser = db.Dat_Account
                    .FirstOrDefault(u => u.UserName == Email.Text
                    && u.Password == Password.Text);

生成的应用程序用户

public class ApplicationUser : IdentityUser
    {
        public ClaimsIdentity GenerateUserIdentity(ApplicationUserManager manager)
        {
            // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
            var userIdentity = manager.CreateIdentity(this, DefaultAuthenticationTypes.ApplicationCookie);
            // Add custom user claims here
            return userIdentity;
        }
        public Task<ClaimsIdentity> GenerateUserIdentityAsync(ApplicationUserManager manager)
        {
            return Task.FromResult(GenerateUserIdentity(manager));
        }
    }

我的用户表包含的字段不仅仅是用户名、电子邮件和密码。这是否可能导致问题?

上下文:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
        : base("MyDBEntities", throwIfV1Schema: false)
        {
        }
        public static ApplicationDbContext Create()
        {
            return new ApplicationDbContext();
        }
    }

实体类型应用程序用户不是当前上下文的模型的一部分

看起来您没有数据库初始值设定项,因此默认行为为 CreateDatabaseIfNotExists。因此,要么删除现有数据库,让 EF 使用标识内容创建它,要么将初始值设定项切换到构造函数中的 DropCreateDatabaseWhenModelChanges:

static ApplicationDbContext() {
    Database.SetInitializer(new DropCreateDatabaseWhenModelChanges<ApplicationDbContext>());
}

一旦您启动并运行并拥有您不想丢失的数据,您应该关闭初始值设定项(Database.SetInitializer(new NullDatabaseInitializer());)或使用迁移。

http://www.codeguru.com/csharp/article.php/c19999/Understanding-Database-Initializers-in-Entity-Framework-Code-First.htm

相关文章: