Jo Smo
Jo Smo

Reputation: 7169

How to properly merge ApplicationDbContext with your custom DbContext

I'm trying to do the following... When a user submits a new article, i want to display the authors (users) username in my web application. That's why i need to "connect" these two and i want to have only 1 DbContext.

Now i'm doing it this way:

public class ApplicationDbContext : IdentityDbContext
{
    public DbSet<ApplicationUser> ApplicationUsers { get; set; }
    private DbSet<Article> Articles { get; set; } // This line is all i have added/changed. Everything else was auto-generated when i created a new ASP.net MVC project with individual authentication in visual studio.

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

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

But i'm not sure if this is the right way to do it. How should this be done properly?

UPDATE (explanation of my comment to DavidG's answer)

First i was retrieving a list of users like this:

class ApplicationUserService
{
    public List<ApplicationUser> GetUsers()
    {
        using (var dbContext = new ApplicationDbContext())
        {
            return dbContext.ApplicationUsers.ToList();
        }
    }
}

instead of:

class ApplicationUserService
{
    public List<IdentityUser> GetUsers()
    {
        using (var dbContext = new ApplicationDbContext())
        {
            return dbContext.Users.ToList();
        }
    }
}

The problem was that i couldn't get the UserName or any other property because of this mistake. I watched some tutorials online, no one ever mentioned that the DbSet is Users. Anyways... now i know why i don't need this property:

public DbSet<ApplicationUser> ApplicationUsers { get; set; }

This message from VS helped me (intended for other people which should stumble upon the same problem i had):

'ApplicationDbContext.Users' hides inherited member 'IdentityDbContext<IdentityUser, IdentityRole, string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim>.Users'.

Upvotes: 1

Views: 3117

Answers (2)

DavidG
DavidG

Reputation: 118987

Your application just needs to inherit from the correct version of the IdentityDbContext class. You need to use the generic one so you can customise the user class with your own IdentityUser. So you context should be like this. Note the new inheritance and removal of the ApplicationUsers property. This is removed as the Identity class already has this done for you.

public class ApplicationDbContext : IdentityDbContext<IdentityUser>
{
    private DbSet<Article> Articles { get; set; }

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

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }

}

Upvotes: 1

Eddie Paz
Eddie Paz

Reputation: 2241

This is fine if you want to use one context, and the Identity tables are in the same database as your "article" table. I normally like to override OnModelCreating so I can add mapping/configurations for tables I create.

Depending on the size of the application, I leave the Identity context alone, and I create one for my application (I may include the Users table to make it easier to retrieve users). A matter of choice.

Upvotes: 3

Related Questions