实体框架用户角色一对一关系而不是多对多关系

时间:2014-12-30 10:20:07

标签: c# asp.net-mvc-4 ef-code-first asp.net-identity

默认情况下,Asp.Net提供表AspNetUsers,AspNetRoles,AspNetUserRoles之间的多对多关系。在这里,我想在AspNetUsers和AspNetRoles之间将这些关系从(Many-to-Many)更改为(One-to-One),然后才想使用Entity Framework Code First删除AspNetUserRoles。

我尝试使用以下代码,但它代表错误。The item with identity 'ApplicationRole_Users' already exists in the metadata collection. Parameter name: item

我正在使用Entity Framework Code First

public class ApplicationUser : IdentityUser
{
    [Required]
    public string FirstName { get; set; }

    [Required]
    public string LastName { get; set; }

    [Required]
    [EmailAddress]
   new public string Email { get; set; }

    [Required]
    public string RoleId { get; set; }

    [ForeignKey("RoleId")]
    public virtual ApplicationRole ApplicationRoles { get; set; }
}

这是ApplicationRole模型

public class ApplicationRole : IdentityRole
{
    public ApplicationRole() : base() { }


    public ApplicationRole(string name, string description) : base(name)
    {
        this.Description = description;
    }
    public virtual string Description { get; set; }

    public virtual ICollection<ApplicationUser> Users { get; set; }

}

这是我的ApplicationDBContext类

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{        
    //public virtual IDbSet<ApplicationUser> Users { get; set; }
    public virtual IDbSet<ApplicationRole> ApplicationRoles { get; set; }
    public virtual IDbSet<Group> Groups { get; set; }
    public virtual IDbSet<UserGroup> UserGroups { get; set; }

    public ApplicationDbContext(): base("PHELeadContext")
    {}

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        if (modelBuilder == null)
        {
            throw new ArgumentNullException("modelBuilder");
        }


        modelBuilder.Entity<IdentityUser>().ToTable("AspNetUsers");

        EntityTypeConfiguration<ApplicationUser> table =
            modelBuilder.Entity<ApplicationUser>().ToTable("AspNetUsers");

        table.Property((ApplicationUser u) => u.UserName).IsRequired();

        modelBuilder.Entity<ApplicationRole>().HasMany<ApplicationUser>((ApplicationRole u) => u.Users);            

        EntityTypeConfiguration<IdentityUserLogin> entityTypeConfiguration =
            modelBuilder.Entity<IdentityUserLogin>().HasKey((IdentityUserLogin l) =>
                new { UserId = l.UserId, LoginProvider = l.LoginProvider, ProviderKey = l.ProviderKey }).ToTable("AspNetUserLogins");

        EntityTypeConfiguration<IdentityUserClaim> table1 = modelBuilder.Entity<IdentityUserClaim>().ToTable("AspNetUserClaims");

        modelBuilder.Entity<IdentityRole>().ToTable("AspNetRoles");

        // Change these from IdentityRole to ApplicationRole:
        EntityTypeConfiguration<ApplicationRole> entityTypeConfiguration1 = modelBuilder.Entity<ApplicationRole>().ToTable("AspNetRoles");
        entityTypeConfiguration1.Property((ApplicationRole r) => r.Name).IsRequired();
    }
}

我的问题是..是否可以更改Asp.Net的元表之间的关系AspNetUsersAspNetRolesAspNetUserRole

0 个答案:

没有答案