使用Asp.Net Identity进行MVC5和实体迁移

时间:2014-05-14 17:22:00

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

我有一个问题,我一直在努力。我将不胜感激任何帮助

所以,我有一个首先使用Code的应用程序。对于身份验证,我使用Asp.Net Identity 2.0.1。所以我有一个User类来自Identity User,如下所示:

public class User: IdentityUser
{
    public virtual UserInfo UserInfo { get; set; }
    public virtual Organization Organization { get; set; }
}

然后我将我的上下文定义为:

public class IdentityContext: IdentityDbContext<User>
{
    public IdentityContext(): base("Name=IdentityContext")
    {
    }

    static IdentityContext()
    {
        Database.SetInitializer<IdentityContext>(new CreateDatabaseIfNotExists<IdentityContext>());
    }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Configurations.Add(new UserMap());
        modelBuilder.Configurations.Add(new UserInfoMap());
    }
}

然后我使用此上下文启用迁移。由于Organization类链接到User,因此它也会添加到迁移中。但我不希望这样,因为它与Identity类不同。我的组织课程如下:

public partial class Organization: EntityBase
{
    public Organization()
    {
        this.Users = new List<User>();
    }
    public int OrganizationId { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public virtual ICollection<User> Users { get; set; }
}

它派生自EntityBase,而不是来自IdentityUser类,并且处理方式不同。

我能做的是通过不同的上下文来处理我的所有非身份类,比如说AppContext可以定义为:

public class AppContext: DbContextBase
{
    public AppContext(): base("Name=IdentityContext")
    {
    }

    static AppContext()
    {
        Database.SetInitializer<AppContext>(new CreateDatabaseIfNotExists<AppContext>());
    }

    public new IDbSet<T> Set<T>() where T : class
    {
        return base.Set<T>();
    }

    protected override void OnModelCreating(DbModelBuilder builder)
    {
        builder.Configurations.Add(new OrganizationMap());
    }
}

然后为此上下文启用第二次迁移。

但是,当我启用第二次迁移时,它会失败,除了&#34;迁移已经在项目&#39;数据存储区中启用了。要覆盖现有迁移配置,请使用-Force参数。&#34;。虽然它仍然为第二次迁移创建配置文件。

因此,当我尝试为此配置添加迁移时,它会抱怨以下内容:

  

在模型生成期间检测到一个或多个验证错误:

     

Datastore.IdentityUserLogin :: EntityType&#39; IdentityUserLogin&#39;没有   键定义。定义此EntityType的密钥。

     

Datastore.IdentityUserRole :: EntityType&#39; IdentityUserRole&#39;没有钥匙   定义。定义此EntityType的键。

     

Datastore.UserInfo :: EntityType&#39; UserInfo&#39;没有定义键。为此定义密钥   的EntityType。

     

IdentityUserLogins:EntityType:EntitySet&#39; IdentityUserLogins&#39;基于类型&gt;&#39; IdentityUserLogin&#39;没有&gt;键定义。

     

IdentityUserRoles:EntityType:EntitySet&#39; IdentityUserRoles&#39;基于类型&gt;&#39; IdentityUserRole&#39;没有   键定义。

     

UserInfoes:EntityType:EntitySet&#39; UserInfoes&#39;基于类型&#39; UserInfo&#39;没有&gt;键定义。

我不知道怎么解决这个问题?任何帮助都非常感谢

1 个答案:

答案 0 :(得分:0)

我们的想法是使用IdentityDbContext继承AppContext。 IdentityDbContext本身继承自DbContext,因此它具有DbContext可用的所有功能以及Asp.Net Identity框架的额外配置要求