当Identity是不同的上下文时,将MVC 5用户添加到角色

时间:2015-02-03 04:20:47

标签: c# entity-framework asp.net-mvc-5 asp.net-identity ef-migrations

我的项目中有两个上下文,两个都可以独立工作,我可以使用ApplicationDbContext注册用户,其余的数据使用单独的上下文保存到数据库。我已经走了这条路,所以如果这是一个坏主意,我已经在这里,需要找到解决方案。

我想添加一些用户和角色。所以我正在使用部署到Azure教程中的一些代码。您将在我的AddUserAndRole方法中看到我使用的是与配置和种子方法不同的上下文。如何解决这个问题,将这些用户添加到各自的角色?

namespace XxxXxx.Migrations
{
    using Microsoft.AspNet.Identity.EntityFramework;
    using XxxXxx.Models;
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;
    using System.Linq;

    internal sealed class Configuration : 
             DbMigrationsConfiguration<XxxXxx.DataLayer.myOwnContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
        }

        bool AddUserAndRole(XxxXxx.Models.Account.ApplicationDbContext context)
        {
            IdentityResult ir;
            var rm = new RoleManager<IdentityRole> 
                    (new RoleStore<IdentityRole>(context));
            ir = rm.Create(new IdentityRole("admin"));
            var um = new UserManager<ApplicationUser>
                    (new UserStore<ApplicationUser>(context));
            var user = new ApplicationUser()
            {
                UserName = "xx.xxx@gmail.com"
            };
            ir = um.Create(user, "12341234");
            if (ir.Succeeded == false)
                return ir.Succeeded;
            ir = um.AddToRole(user.Id, "isAdmin");
            return ir.Succeeded;
        }


        protected override void Seed(XxxXxx.DataLayer.myOwnContext context)
        {
            AddUserAndRole(context);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我终于能够弄清楚如何做到这一点。让我快速重置舞台。

1)我使用Identity开始了一个典型的MVC项目,并立即注册了一些用户。 2)然后我开始使用代码优先来保持对数据库的更改,但是我将配置文件中的上下文名称更改为ApplicationDbContext以外的其他名称,并继续使用该新上下文以及代码优先于我的站点在重新定制用户之前的数月内的数据。

3)我终于达到了我想要改变用户和角色的程度。但不确定如何定位该背景。

以下是我采取的步骤:

我打开了我的控制台,并使用-ContextTypeName为新上下文启用了迁移,并为上下文指定了新的迁移目录:

Enable-Migrations -ContextTypeName ApplicationDbContext -MigrationsDirectory Migrations\ApplicationDbContext

然后我更改了IdentityModel.cs文件并添加了新的更改:

Models / IdentityModel.cs(ApplicationUser类)

//Additonal Properties for User
[Display(Name = "First Name")]
public string FirstName { get; set; }
[Display(Name = "Last Name")]
public string LastName { get; set; }
[Display(Name = "Local Code")]
public string LocalCode { get; set; }

然后我将add-migration与-ConfigurationTypeName和我的其他上下文的路径结合使用

Add-Migration -ConfigurationTypeName ProjectNamespace.Migrations.ApplicationDbContext.Configuration "AdditionalUserFields"

接下来,我们需要做的就是使用Update-Database-ConfigurationTypeName来保留这些更改,并再次指定上下文的路径。

Update-Database -ConfigurationTypeName ProjectNamespace.Migrations.ApplicationDbContext.Configuration

理论上你可以在MVC中使用许多不同的上下文来做这件事,但我不会在我的项目中随时使用两个以上,只是因为它有点令人困惑。我也不知道这样做是否有任何缺点。我这样做的原因是因为我不喜欢使用继承自ApplicationDbContext的{​​{1}}代码优先的想法。由于我的网站数据与我的应用程序用户无关,因此除此之外没有其他具体原因。有人告诉我,只要在所有事情上使用IdentityDbContext<ApplicationUser>就没有错,......事后

希望这对某人有益。我确实找到了StackOverflow的另一个答案,最终帮助了我。这是:

Stack Overflow问题:Multiple Db Contexts in the same db/application