PussInBoots PussInBoots - 22 days ago 19
ASP.NET (C#) Question

ASP.NET Identity DbContext confusion

A default MVC 5 App comes with this piece of code in IdentityModels.cs - this piece of code is for all the ASP.NET Identity operations for the default templates:

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


If I scaffold a new controller using views with Entity Framework and create a "New data context..." in the dialog, I get this generated for me:

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;

namespace WebApplication1.Models
{
public class AllTheOtherStuffDbContext : DbContext
{
// You can add custom code to this file. Changes will not be overwritten.
//
// If you want Entity Framework to drop and regenerate your database
// automatically whenever you change your model schema, please use data migrations.
// For more information refer to the documentation:
// http://msdn.microsoft.com/en-us/data/jj591621.aspx

public AllTheOtherStuffDbContext() : base("name=AllTheOtherStuffDbContext")
{
}

public System.Data.Entity.DbSet<WebApplication1.Models.Movie> Movies { get; set; }

}
}


If I scaffold another controller + view using EF, say for instance for an Animal model, this new line would get autogenerated right under
public System.Data.Entity.DbSet<WebApplication1.Models.Movie> Movies { get; set; }
- like this:

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;

namespace WebApplication1.Models
{
public class AllTheOtherStuffDbContext : DbContext
{
// You can add custom code to this file. Changes will not be overwritten.
//
// If you want Entity Framework to drop and regenerate your database
// automatically whenever you change your model schema, please use data migrations.
// For more information refer to the documentation:
// http://msdn.microsoft.com/en-us/data/jj591621.aspx

public AllTheOtherStuffDbContext() : base("name=AllTheOtherStuffDbContext")
{
}

public System.Data.Entity.DbSet<WebApplication1.Models.Movie> Movies { get; set; }
public System.Data.Entity.DbSet<WebApplication1.Models.Animal> Animals { get; set; }

}
}


ApplicationDbContext
(for all the ASP.NET Identity stuff) inherits from
IdentityDbContext
which in turn inherits from
DbContext
.
AllOtherStuffDbContext
(for my own stuff) inherits from
DbContext
.

So my question is:

Which of these two (
ApplicationDbContext
and
AllOtherStuffDbContext
) should I use for all my other own models? Or should I just use the default autogenerated
ApplicationDbContext
since it shouldn't be a problem using it since it derives from the base class
DbContext
, or will there be some overhead? You should use only one
DbContext
object in your app for all your models (I've read this somewhere) so I should not even consider using both
ApplicationDbContext
and
AllOtherStuffDbContext
in a single app? Or what is best practice in MVC 5 with ASP.NET Identity?

Answer

I would use a single Context class inheriting from IdentityDbContext. This way you can have the context be aware of any relations between your classes and the IdentityUser and Roles of the IdentityDbContext. There is very little overhead in the IdentityDbContext, it is basically a regular DbContext with two DbSets. One for the users and one for the roles.