13

I am trying to add profile/Membership information into my MVC5 application and adding configuration mappings.

I get the following error message:

my.Models.IdentityUserLogin: : EntityType 'IdentityUserLogin' has no key defined. Define the key for this EntityType.

my.Models.IdentityUserRole: : EntityType 'IdentityUserRole' has no key defined. Define the key for this EntityType.

IdentityUserLogins: EntityType: EntitySet 'IdentityUserLogins' is based on type 'IdentityUserLogin' that has no keys defined.

IdentityUserRoles: EntityType: EntitySet 'IdentityUserRoles' is based on type 'IdentityUserRole' that has no keys defined.

public class ApplicationUser : IdentityUser
{
    public string City { get; set; }
    public string Discriminator { get; set; }

    public string Address { get; set; }     
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new ApplicationUserConfiguration());           
    }
}
0

3 Answers 3

22

Calling base.OnModelCreating(modelBuilder) did not solve the issue for me.

The behavior of Microsoft.AspNet.Identity.EntityFramework seems to be different in VS2013-Preview, VS2013-RC, and VS2013-RTM. I'm using the RTM version.

After inheriting from IdentityUser I had to recreate all other primary keys in the model to make it work:

public class ApplicationUser : IdentityUser
{
    public string DisplayName { get; set; }
}


public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext() : base("DefaultConnection") { }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);
        modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id);
        modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });
    }

(See Configuring/Mapping Properties and Types with the Fluent API)

I guess work on AspNet.Identity.EntityFramework is ongoing and this will be fixed (?)

Sign up to request clarification or add additional context in comments.

5 Comments

I've had to do exactly the same thing to get by this issue. I thought that EF would pick out the entity IDs automatically?
This resolved it all for me! Many thanks - should be marked as answered :)
I have had a similar problem and tried this solution and thought it fixed the problem but I am getting few extra tables in the database such as IdentityUsers, and I also still have AspNetUsers table. What did i do wrong?
@LaurenceNyein place base.OnModelCreating(modelBuilder) as last call in methode.
19

Call base.OnModelCreating(modelBuilder) after configuration added.

2 Comments

if this doesnt work..try calling it before the configurationaded
It would seem base.OnModelCreating(modelBuilder); must be called if IdentityDbContext<ApplicationUser> is used, OnModelCreating overridden, and I am not manually configuring IdentityUserLogin, IdentityUserRole and IdentityUserClaim with attributes or the fluent API.
0

Follow these steps around OnModelCreating method and test after each one to be aware of taking effect:

  1. Make sure you have one Context to prevent of their rule conflicts.
  2. Call base.OnModelCreating(modelBuilder); inside the mentioned method (first of all)
  3. Add the followings plus previews step in the method:


modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);
modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id);
modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.